c# - bootstrap - uwp vs wpf
Aplicación UWP se bloquea aleatoriamente al volver a la página anterior (2)
Este tipo de excepciones no brindan demasiadas pistas sobre qué las está causando, pero hay algunas cosas que puede intentar:
-
lstOrders
elScrollViewer
de alrededor delstOrders
. No agrega ningún valor, sin embargo, podría romper la virtualización deListView
haciendo que intente usar cantidades arbitrarias de memoria y CPU si hubiera eliminado accidentalmenteMaxHeight
configurado enlstOrders
. - La plantilla
btnSave
es mala ya que elimina los elementos de comentarios interactivos. - Asegúrese de que las propiedades a las que se une no se modifiquen fuera de la secuencia de UI / Dispatcher.
Tengo una aplicación donde enumero algunos elementos y luego cambio a otra página para su edición. En la página de edición, tengo algunos campos en los que necesito elegir un valor de una lista que cargué en otra página. Llamo a la página de la lista desde la página de edición, pasando un método del modelo de vista de página de edición que se invocará cuando se realiza una selección para que pueda actualizar mi modelo y enlaces.
El problema es que a veces, al volver a la página de edición, el depurador se rompe en el archivo generado App.gics con un
"Error HRESULT E_FAIL has been returned from a call to a COM component." exception.
Muestra completamente la página con los enlaces correctos y los valores seleccionados antes de romper.
He excluido posibles errores de la carga asincrónica de la lista de valores reemplazándola por una página ficticia y eliminando las devoluciones de llamadas establecidas por la página de edición. El error aún sucedió La página de edición tiene su modo de caché de navegación establecido en Requerido para que no pierda los cambios anteriores. Intenté sin un modo de caché requerido y todavía recibí el error.
Lo único que pareció resolver el problema fue cuando eliminé los enlaces que usaban convertidores personalizados de la página de edición xaml pero los tengo en otras páginas y nunca tuve un problema. (Ver actualización)
El depurador se rompe en el código generado:
#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
UnhandledException += (sender, e) =>
{
if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
};
Este es el xaml para la página de edición:
<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=""
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=""
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="" />
<TextBlock HorizontalAlignment="Center" Text="Save" />
</StackPanel>
</ControlTemplate>
</Button.Template>
</Button>
</StackPanel>
</ScrollViewer>
</Grid>
Código para el convertidor 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;
}
}
Código para el convertidor 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;
}
}
Dado el código donde el depurador se rompe, el error parece estar en el lado xaml y, como dije, quitar los selectores de fecha y hora, que son los únicos elementos donde el enlace usa un convertidor personalizado, parece arreglarlo.
¿Qué me estoy perdiendo?
ACTUALIZAR
Otras pruebas me han llamado la atención sobre que eliminar los convertidores personalizados no soluciona el problema, simplemente aumenta el número de navegaciones hasta que ocurre el error. Intenté eliminar los enlaces por completo y todavía obtuve el error. La eliminación de cada elemento, pero el botón que llama a la página siguiente parece funcionar, pero en este momento no puedo decir con certeza si realmente soluciona el problema o simplemente lo mitiga.
En una nota lateral, navegar de regreso a la primera página usando el botón Back
del teléfono funciona sin problemas. El error solo parece ocurrir si Frame.GoBack()
se invoca explícitamente.
Como mencioné en los comentarios sobre la pregunta, he estado experimentando este problema hoy. Fue relativamente sencillo aislar el problema del control TimePicker y, más específicamente, del enlace bidireccional en la propiedad Time del control.
Sin embargo, fue menos sencillo averiguar por qué estaba sucediendo. Parece ser un problema relacionado con la visibilidad (experimento el problema cuando muevo mi aplicación al fondo) y actualizo el valor encuadernado. A pesar de eso, intenté una variedad de cosas en vano.
Al final, traté de cambiar la expresión de enlace de la sintaxis {Binding}
tradicional a la {x:Bind}
compilada y, afortunadamente, el problema desapareció.
Tal vez, den una oportunidad y vean si resuelve su problema. Obviamente, TimePicker deberá estar dentro de una DataTemplate
con un tipo de datos específico o, como en mi caso, un control de usuario con propiedades de dependencia personalizadas.