Work around crash by replacing ItemRepeater with ListView (#1058)

* Replace ItemRepeater with ListView

* Allow animations

* undo temp key change

* Remove animation
This commit is contained in:
Pepe Rivera 2020-03-11 09:41:52 -07:00 committed by GitHub
parent 2caea01c6f
commit ebc57af203
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 85 additions and 55 deletions

View File

@ -775,58 +775,88 @@
</Style> </Style>
</ResourceDictionary> </ResourceDictionary>
</UserControl.Resources> </UserControl.Resources>
<mux:ItemsRepeaterScrollHost> <ScrollViewer VerticalScrollBarVisibility="Auto">
<ScrollViewer VerticalScrollBarVisibility="Auto"> <StackPanel>
<StackPanel> <!-- This ListView and the one below should be replacted by an ItemRepeater once https://github.com/microsoft/microsoft-ui-xaml/issues/2011 is fixed. -->
<mux:ItemsRepeater x:Name="EquationInputList" <ListView x:Name="EquationInputList"
ItemsSource="{x:Bind Equations}" IsItemClickEnabled="False"
TabFocusNavigation="Local"> ItemsSource="{x:Bind Equations}"
<mux:ItemsRepeater.ItemTemplate> SelectionMode="None"
<DataTemplate x:DataType="vm:EquationViewModel"> TabFocusNavigation="Local">
<controls:EquationTextBox x:Uid="EquationInputButton"
Margin="1,0,1,2"
Style="{StaticResource EquationTextBoxStyle}"
DataContext="{x:Bind Mode=OneWay}"
DataContextChanged="EquationTextBox_DataContextChanged"
EquationButtonClicked="EquationTextBox_EquationButtonClicked"
EquationButtonContentIndex="{x:Bind FunctionLabelIndex, Mode=OneWay}"
EquationColor="{x:Bind local:EquationInputArea.ToSolidColorBrush(LineColor), Mode=OneWay}"
EquationFormatRequested="EquationTextBox_EquationFormatRequested"
EquationSubmitted="EquationTextBox_Submitted"
GotFocus="EquationTextBox_GotFocus"
HasError="{x:Bind GraphEquation.HasGraphError, Mode=OneWay}"
IsAddEquationMode="{x:Bind IsLastItemInList, Mode=OneWay}"
KeyGraphFeaturesButtonClicked="EquationTextBox_KeyGraphFeaturesButtonClicked"
Loaded="EquationTextBox_Loaded"
LostFocus="EquationTextBox_LostFocus"
MathEquation="{x:Bind Expression, Mode=TwoWay}"
RemoveButtonClicked="EquationTextBox_RemoveButtonClicked">
<controls:EquationTextBox.ColorChooserFlyout>
<Flyout x:Uid="ColorChooserFlyout" Placement="Bottom">
<local:EquationStylePanelControl SelectedColor="{x:Bind LineColor, Mode=TwoWay}"/>
</Flyout>
</controls:EquationTextBox.ColorChooserFlyout>
</controls:EquationTextBox>
</DataTemplate>
</mux:ItemsRepeater.ItemTemplate>
</mux:ItemsRepeater>
<StackPanel x:Name="VariableStackPanel" x:Load="{x:Bind local:EquationInputArea.ManageEditVariablesButtonLoaded(Variables.Size), Mode=OneWay}">
<Rectangle Height="1"
Margin="12"
Fill="#33000000"/>
<mux:ItemsRepeater ItemTemplate="{StaticResource VariableDataTemplate}"
ItemsSource="{x:Bind Variables, Mode=OneWay}"
TabFocusNavigation="Local">
<mux:ItemsRepeater.Transitions>
<TransitionCollection>
<AddDeleteThemeTransition/>
</TransitionCollection>
</mux:ItemsRepeater.Transitions>
</mux:ItemsRepeater>
</StackPanel>
</StackPanel>
</ScrollViewer> <!-- Removes animations from the ListView Style. -->
</mux:ItemsRepeaterScrollHost> <ListView.Style>
<Style TargetType="ListView">
<Setter Property="ItemContainerTransitions">
<Setter.Value>
<TransitionCollection/>
</Setter.Value>
</Setter>
</Style>
</ListView.Style>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="Padding" Value="0"/>
<Setter Property="Margin" Value="1,0,1,0"/>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate x:DataType="vm:EquationViewModel">
<controls:EquationTextBox x:Uid="EquationInputButton"
Margin="1,0,1,2"
Style="{StaticResource EquationTextBoxStyle}"
DataContext="{x:Bind Mode=OneWay}"
DataContextChanged="EquationTextBox_DataContextChanged"
EquationButtonClicked="EquationTextBox_EquationButtonClicked"
EquationButtonContentIndex="{x:Bind FunctionLabelIndex, Mode=OneWay}"
EquationColor="{x:Bind local:EquationInputArea.ToSolidColorBrush(LineColor), Mode=OneWay}"
EquationFormatRequested="EquationTextBox_EquationFormatRequested"
EquationSubmitted="EquationTextBox_Submitted"
GotFocus="EquationTextBox_GotFocus"
HasError="{x:Bind GraphEquation.HasGraphError, Mode=OneWay}"
IsAddEquationMode="{x:Bind IsLastItemInList, Mode=OneWay}"
KeyGraphFeaturesButtonClicked="EquationTextBox_KeyGraphFeaturesButtonClicked"
Loaded="EquationTextBox_Loaded"
LostFocus="EquationTextBox_LostFocus"
MathEquation="{x:Bind Expression, Mode=TwoWay}"
RemoveButtonClicked="EquationTextBox_RemoveButtonClicked">
<controls:EquationTextBox.ColorChooserFlyout>
<Flyout x:Uid="ColorChooserFlyout" Placement="Bottom">
<local:EquationStylePanelControl SelectedColor="{x:Bind LineColor, Mode=TwoWay}"/>
</Flyout>
</controls:EquationTextBox.ColorChooserFlyout>
</controls:EquationTextBox>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<StackPanel x:Name="VariableStackPanel" x:Load="{x:Bind local:EquationInputArea.ManageEditVariablesButtonLoaded(Variables.Size), Mode=OneWay}">
<Rectangle Height="1"
Margin="12"
Fill="#33000000"/>
<ListView IsItemClickEnabled="False"
ItemTemplate="{StaticResource VariableDataTemplate}"
ItemsSource="{x:Bind Variables, Mode=OneWay}"
SelectionMode="None"
TabFocusNavigation="Local">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="Padding" Value="0"/>
<Setter Property="Margin" Value="1,0,1,0"/>
</Style>
</ListView.ItemContainerStyle>
<ListView.Transitions>
<TransitionCollection>
<AddDeleteThemeTransition/>
</TransitionCollection>
</ListView.Transitions>
</ListView>
</StackPanel>
</StackPanel>
</ScrollViewer>
</UserControl> </UserControl>

View File

@ -149,7 +149,7 @@ void EquationInputArea::FocusEquationTextBox(EquationViewModel ^ equation)
{ {
return; return;
} }
auto container = EquationInputList->TryGetElement(index); auto container = EquationInputList->ContainerFromIndex(index);
if (container == nullptr) if (container == nullptr)
{ {
return; return;
@ -234,7 +234,7 @@ void EquationInputArea::EquationTextBox_Loaded(Object ^ sender, RoutedEventArgs
unsigned int index; unsigned int index;
if (Equations->IndexOf(copyEquationToFocus, &index)) if (Equations->IndexOf(copyEquationToFocus, &index))
{ {
auto container = EquationInputList->TryGetElement(index); auto container = static_cast<UIElement^>(EquationInputList->ContainerFromIndex(index));
if (container != nullptr) if (container != nullptr)
{ {
container->StartBringIntoView(); container->StartBringIntoView();
@ -264,7 +264,7 @@ void EquationInputArea::FocusEquationIfNecessary(CalculatorApp::Controls::Equati
unsigned int index; unsigned int index;
if (Equations->IndexOf(m_equationToFocus, &index)) if (Equations->IndexOf(m_equationToFocus, &index))
{ {
auto container = EquationInputList->TryGetElement(index); auto container = static_cast<UIElement ^>(EquationInputList->ContainerFromIndex(index));
if (container != nullptr) if (container != nullptr)
{ {
container->StartBringIntoView(); container->StartBringIntoView();