添加更改 GridView 模板的选项后旋转设备时应用程序崩溃

App crashes when rotating device after adding option to change GridView Templates

我有一个 GridView 绑定到 sampledata 的应用程序。我有一个按钮可以切换 GridView 的布局(列表、网格)。它工作正常,但是在更改数据模板后我旋转 phone 的那一刻,应用程序崩溃了。我在 App.g.i.cs 文件中得到这个:

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

我已经将问题缩小到这段代码:

FontIcon fi = new FontIcon(); 
fi.Glyph = "\uE80A"; 
ViewItems.Icon = fi; 
ViewItemsBottom.Icon = fi; 

我不知道为什么。我的 appbarbutton 有一个自定义字形作为图标,这是我更改它的地方。当我使用上面的代码更改 phone 后旋转 phone 时,应用程序崩溃了。如果我注释掉这部分代码,就不会崩溃。有人知道如何解决这个问题吗?


我更改模板的方式是在页面资源中定义了两个数据模板:

<Page.Resources>

    <DataTemplate x:Key="WideTile" x:Name="WideTile">
        <StackPanel Width="300" Height="80" Margin="0,0,0,0" Orientation="Horizontal"
                               Background="{ThemeResource MainBackgroundColor}" 
                               BorderBrush="#11000000"
                               BorderThickness="0,0,2,2"
                               Padding="10">
            <StackPanel Margin="10,0,0,0" Width="40" Height="40" HorizontalAlignment="Center" VerticalAlignment="Center">
                <BitmapIcon Width="40" Height="40" 
                                        UriSource="Assets/recipeicon.png" Foreground="{Binding IconColor}"/>
            </StackPanel>
            <Grid Width="200" Height="80" Margin="20,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Center">
                <TextBlock HorizontalAlignment="Left" VerticalAlignment="Center"
                                       Text="{Binding RecipeName}" 
                                       Foreground="White"
                                       FontSize="16"/>
            </Grid>
        </StackPanel>
    </DataTemplate>

    <DataTemplate x:Key="SquareTile" x:Name="SquareTile">
        <StackPanel Width="150" Height="150" Margin="0,0,0,0" Orientation="Vertical"
                               Background="{ThemeResource MainBackgroundColor}" 
                               BorderBrush="#11000000"
                               BorderThickness="0,0,2,2"
                               Padding="10">
            <StackPanel Margin="0,30,0,0" Width="130" Height="110" HorizontalAlignment="Center" VerticalAlignment="Center">
                <BitmapIcon Width="50" Height="50" 
                                        UriSource="Assets/recipeicon.png" Foreground="{Binding IconColor}"/>
            </StackPanel>
            <Grid Width="150" Height="20" Margin="0,-30,0,0" HorizontalAlignment="Left" VerticalAlignment="Top">
                <TextBlock HorizontalAlignment="Left" VerticalAlignment="Center"
                                       Text="{Binding RecipeName}" 
                                       Foreground="White"
                                       FontSize="12"/>
            </Grid>
        </StackPanel>
    </DataTemplate>
</Page.Resources>

我有调用此代码进行更改的按钮:

private void ViewItems_Click(object sender, RoutedEventArgs e)
    {
        if (gridViewStyle == "0")
        {
            gridViewStyle = "1";
        } else if (gridViewStyle == "1")
        {
            gridViewStyle = "0";
        }

        setGridViewLayout();
        localSettings.Values["gridViewStyle"] = gridViewStyle;
    }


    private void setGridViewLayout()
    {
        if (gridViewStyle == "0")
        {
            DataTemplate tmpl;
            tmpl = WideTile;
            recipeGridView.ItemTemplate = tmpl;

            FontIcon fi = new FontIcon();
            fi.Glyph =  "\uE80A";

            ViewItems.Icon = fi;
            ViewItems.Label = "Square";
            ViewItemsBottom.Icon = fi;
            ViewItemsBottom.Label = "Square";
        }
        else if (gridViewStyle == "1")
        {
            DataTemplate tmpl; 
            tmpl = SquareTile;
            recipeGridView.ItemTemplate = tmpl;

            FontIcon fi = new FontIcon();
            fi.Glyph = "\uE292";

            ViewItems.Icon = fi;
            ViewItems.Label = "Wide";
            ViewItemsBottom.Icon = fi;
            ViewItemsBottom.Label = "Wide";
        }
    }

大部分代码只是根据它们当前所在的视图来更改应用栏图标字形和文本,但它的主要目的是我这样做是为了更改数据模板:

DataTemplate tmpl;
tmpl = WideTile;
recipeGridView.ItemTemplate = tmpl;

如果我加载应用程序并且不更改 gridview,当我旋转 phone 时不会崩溃。我手动分配数据模板的那一分钟,phone 在我旋转它时崩溃了。

如果你很好奇,这是我的视觉状态管理器 XAML,当我旋转 phone:

<VisualStateManager.VisualStateGroups>
        <VisualStateGroup>

            <!-- Wider than 600px -->
            <VisualState x:Name="WideState">
                <VisualState.StateTriggers>
                    <AdaptiveTrigger MinWindowWidth="600" />
                </VisualState.StateTriggers>

                <VisualState.Setters>
                    <Setter Target="TheCommandBar.Visibility" Value="Visible" />
                    <Setter Target="TheCommandBarBottom.Visibility" Value="Collapsed" />
                </VisualState.Setters>
            </VisualState>

            <!-- Narrower than 600px -->
            <VisualState x:Name="NarrowState">
                <VisualState.StateTriggers>
                    <AdaptiveTrigger MinWindowWidth="0" />
                </VisualState.StateTriggers>

                <VisualState.Setters>
                    <Setter Target="TheCommandBar.Visibility" Value="Collapsed" />
                    <Setter Target="TheCommandBarBottom.Visibility" Value="Visible" />
                </VisualState.Setters>
            </VisualState>

        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>

可以,只是不能重复使用同一个 FontIcon 两次。

此代码工作正常:

FontIcon fi = new FontIcon();
FontIcon fi2 = new FontIcon();

fi.Glyph = "\uE80A";
fi2.Glyph = "\uE80A";

ViewItems.Icon = fi;
ViewItemsBottom.Icon = fi2;