如果背景颜色更改,WinRT ListPickerFlyout 会使应用程序崩溃

WinRT ListPickerFlyout crashes App if background color changed

如果我将以下代码放入框架 WinRT 应用程序中,它不会构建主页:

<Page
x:Class="TestApp1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:TestApp1"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Background="Blue">

<Page.Resources>
    <ListPickerFlyout x:Key="btnfly"/>
</Page.Resources>

<Grid>

</Grid>
</Page>

错误是:

An exception of type 'Windows.UI.Xaml.Markup.XamlParseException' occurred in TestApp1.WindowsPhone.exe but was not handled in user code WinRT information: Cannot create instance of type '%0' [Line: 12 Position: 42]

Background 标签改回 {ThemeResource ApplicationPageBackgroundThemeBrush} 可以解决问题。

知道如何更改页面的背景颜色并仍然使用 ListPickerFlyout 吗?

简单的解决方案是在构造函数中设置背景颜色, 调用 InitializeComponent 之后:

public MainPage()
{
  this.InitializeComponent();

  // Or the colour of your choice...
  Background = new SolidColorBrush(Windows.UI.Colors.Blue);

  this.NavigationCacheMode = NavigationCacheMode.Required;
}

有趣的问题是 "why?" - 我的猜测是,因为 ListPickerFlyout 实际上不是 UIElement,所以在初始化期间发生了一些奇怪的交互。

是的,"why"是一个有趣的问题,Peter 的回答很好。

我还从另一个 Whosebug 问题中找到了另一个答案。

首先,通过将以下内容添加到 App.xaml 来覆盖 FlyoutBackgroundThemeBrush:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.ThemeDictionaries>
            <ResourceDictionary x:Key="Dark">
                <SolidColorBrush x:Key="FlyoutBackgroundThemeBrush" Color="Blue" />
            </ResourceDictionary>
            <ResourceDictionary x:Key="Light">
                <SolidColorBrush x:Key="FlyoutBackgroundThemeBrush" Color="Blue" />
            </ResourceDictionary>
        </ResourceDictionary.ThemeDictionaries>
    </ResourceDictionary>
</Application.Resources>

然后把页面背景改成Background="{ThemeResource FlyoutBackgroundThemeBrush}"