gpt4 book ai didi

c# - UWP App 返回上一页时随机崩溃

转载 作者:行者123 更新时间:2023-11-30 12:56:54 28 4
gpt4 key购买 nike

我有一个应用程序,我在其中列出了一些项目,然后切换到另一个页面进行编辑。在编辑页面中,我有一些字段需要从我加载到另一个页面的列表中选择一个值。我从编辑页面调用列表页面,传递来自编辑页面 View 模型的方法,以便在做出选择时调用,以便我可以更新我的模型和绑定(bind)。

问题是有时,当返回到编辑页面时,调试器会在生成的文件 App.g.i.cs 中中断

 "Error HRESULT E_FAIL has been returned from a call to a COM component." exception. 

它在中断之前使用正确的绑定(bind)和选定的值完整显示页面。

我已将值列表的异步加载排除在外,方法是将其替换为虚拟页面并删除编辑页面设置的任何回调。错误仍然发生。编辑页面将其导航缓存模式设置为必需,这样我就不会丢失之前的更改。我在没有必需的缓存模式的情况下进行了尝试,但仍然出现错误。

似乎唯一解决问题的方法是当我从编辑页面 xaml 中删除使用自定义转换器的绑定(bind)时,但我在其他页面中有这些绑定(bind)并且从未遇到过问题。(请参阅更新)

调试器在生成的代码中中断:

#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
UnhandledException += (sender, e) =>
{
if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
};

这是编辑页面的 xaml:

<Page.Resources>
<converters:BooleanToVisibilityConverter x:Key="BoolToVisibility" />
<converters:StringFormatConverter x:Key="StringFormat" />
<converters:DateTimeToDateTimeOffsetConverter x:Key="DateOffset" />
<converters:DateTimeToTimeSpanConverter x:Key="TimeSpan" />
</Page.Resources>

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<fieldSelectControl:BackButtonAndTitle Title="Page Title" />
<StackPanel Grid.Row="1" Orientation="Horizontal">
<Button Name="HomeButton"
Width="70"
Height="50"
Background="Black"
Content="&#xE80F;"
FontFamily="Segoe MDL2 Assets"
FontSize="30" />
<TextBlock Name="PageTitle"
FontSize="36"
Text="{Binding OrderTitle}" />
</StackPanel>
<ProgressRing Grid.Row="2" IsActive="{Binding IsLoading}" />

<ScrollViewer Grid.Row="2"
Height="Auto"
HorizontalScrollBarVisibility="Disabled"
VerticalScrollBarVisibility="Auto"
Visibility="{Binding Path=FinishedLoading,
Converter={StaticResource BoolToVisibility}}">

<StackPanel Margin="20,10,20,30">
<TextBlock Margin="0,5,0,5"
Style="{StaticResource DetailLabel}"
Text="Date" />
<DatePicker Date="{Binding Day, Mode=TwoWay, Converter={StaticResource DateOffset}}" />
<TextBlock Margin="0,15,0,5"
Style="{StaticResource DetailLabel}"
Text="Type" />
<ComboBox ItemsSource="{Binding ComboValues}" SelectedItem="{Binding SelectedHourType, Mode=TwoWay}" />

<TextBlock Margin="0,15,0,5"
Style="{StaticResource DetailLabel}"
Text="Start" />
<TimePicker ClockIdentifier="24HourClock" Time="{Binding StartTime, Mode=TwoWay, Converter={StaticResource TimeSpan}}" />

<TextBlock Margin="0,5,0,5"
Style="{StaticResource DetailLabel}"
Text="End" />
<TimePicker ClockIdentifier="24HourClock" Time="{Binding EndTime, Mode=TwoWay, Converter={StaticResource TimeSpan}}" />

<TextBlock Margin="0,15,0,5"
Style="{StaticResource DetailLabel}"
Text="Amount" />
<TextBox InputScope="Number" Text="{Binding HValue, Mode=TwoWay}" />



<fieldSelectControl:FieldWithIconSelector x:Name="fsSelect"
IconClickedEvent="btnClose_Click"
IconField="&#xE109;"
TitleField="Add..."
TitleIconField=""
ValueField="" />

<ScrollViewer Height="Auto"
HorizontalScrollBarVisibility="Disabled"
VerticalScrollBarVisibility="Auto">
<ListView x:Name="lstOrders"
Height="auto"
MaxHeight="600"
HorizontalAlignment="Stretch"
IsItemClickEnabled="True"
ItemClick="lstOrders_ItemClick"
ItemsSource="{Binding SelectedEmployees,
Mode=OneWay}">
<ListView.ItemTemplate>
<DataTemplate x:DataType="data:Responsible">
<fieldSelectControl:FieldWithIconSelector x:Name="fsEmployees"
IconClickedEvent="fsEmployees_IconClickedEvent"
IconField=""
TitleField=""
TitleIconField=""
ValueField="{Binding Name}" />
</DataTemplate>
</ListView.ItemTemplate>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
</ListView.ItemContainerStyle>
</ListView>
</ScrollViewer>
<Button Name="btnSave"
Margin="0,20,0,15"
HorizontalAlignment="Stretch"
Click="btnSave_Click"
Visibility="{Binding Path=FinishedSaving,
Converter={StaticResource BoolToVisibility}}">
<Button.Template>
<ControlTemplate>
<StackPanel HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Background="#0099cc"
Orientation="Vertical"
Padding="5">
<TextBlock HorizontalAlignment="Center"
FontFamily="Segoe MDL2 Assets"
FontSize="25"
Text="&#xE74E;" />
<TextBlock HorizontalAlignment="Center" Text="Save" />
</StackPanel>
</ControlTemplate>
</Button.Template>
</Button>
</StackPanel>



</ScrollViewer>
</Grid>

DateOffset 转换器的代码:

public class DateTimeToDateTimeOffsetConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
try
{
if (value is DateTime)
{
DateTime date = (DateTime)value;
return new DateTimeOffset(date);
}
else
return new DateTimeOffset(DateTime.Now);
}
catch (Exception ex)
{
return new DateTimeOffset(DateTime.Now);
}
}

public object ConvertBack(object value, Type targetType, object parameter, string language)
{
DateTimeOffset dto = (DateTimeOffset)value;
return dto.DateTime;
}
}

TimeOffset 转换器的代码:

public class DateTimeToTimeSpanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
try
{
if (value is DateTime)
{
DateTime date = (DateTime)value;
return new TimeSpan(date.Ticks);
}
else
return new TimeSpan(DateTime.Now.Ticks);
}
catch (Exception ex)
{
return new TimeSpan(DateTime.Now.Ticks);
}
}

public object ConvertBack(object value, Type targetType, object parameter, string language)
{
TimeSpan ts = (TimeSpan)value;
DateTime dt = new DateTime(ts.Ticks);

return dt;
}
}

鉴于调试器中断的代码,错误似乎出在 xaml 端,正如我所说,删除日期和时间选择器(绑定(bind)使用自定义转换器的唯一元素)似乎可以修复它.

我错过了什么?

更新

进一步的测试引起了我的注意,删除自定义转换器实际上并不能解决问题,它只会增加导航次数,直到错误发生。我已经尝试完全删除绑定(bind),但仍然出现错误。删除除调用下一页的按钮之外的所有元素似乎都有效,但此时我无法确定它是否真正解决了问题或只是缓解了问题。

附带说明一下,使用手机 Back 按钮导航回第一页是完美的。该错误似乎只有在显式调用 Frame.GoBack() 时才会发生。

最佳答案

这些类型的异常并没有提供太多关于导致它们的原因的提示,但是您可以尝试一些事情:

  • 我会从 lstOrders 中删除 ScrollViewer。它不会增加任何值,但它可能会破坏 ListView 的虚拟化,如果您不小心删除了 MaxHeight 集,它会尝试使用任意数量的内存和 CPU在 lstOrders 上。
  • btnSave 模板很糟糕,因为它删除了交互式反馈元素。
  • 确保您绑定(bind)的属性不会在 UI/Dispatcher 线程之外更改。

关于c# - UWP App 返回上一页时随机崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37488372/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com