Xaml 弹出按钮不会更改为黑色主题?

Xaml 弹出按钮不会更改为黑色主题?,xaml,themes,uwp,appbar,flyout,Xaml,Themes,Uwp,Appbar,Flyout,该弹出按钮不会将其主题从亮变暗。我不知道为什么。 请参见下面的示例代码。您可以在此处更改主题,然后弹出按钮仍保持为“灯光”主题 MainPage.xaml <Page> <Page.BottomAppBar> <CommandBar> <AppBarButton Icon="Emoji"> <AppBarButton.Flyout>

该弹出按钮不会将其主题从亮变暗。我不知道为什么。 请参见下面的示例代码。您可以在此处更改主题,然后弹出按钮仍保持为“灯光”主题

MainPage.xaml

<Page>
    <Page.BottomAppBar>
        <CommandBar>
            <AppBarButton Icon="Emoji">
                <AppBarButton.Flyout>
                    <Flyout/>
                </AppBarButton.Flyout>
            </AppBarButton>
            <AppBarToggleButton Checked="Checked" Unchecked="Unchecked">
            <AppBarToggleButton.Icon>
                <FontIcon Glyph="&#xE771;" />
            </AppBarToggleButton.Icon>
        </AppBarToggleButton>
    </CommandBar>
    </Page.BottomAppBar>
</Page>

如果将内容放置在弹出型按钮中,您会发现它们适应新的ElementTheme,但是弹出型按钮演示者本身不会更改其背景

 private readonly Color _darkColor = Color.FromArgb(255, 43, 43, 43);//themeresources.xaml - Default
 private readonly Color _lightColor = Color.FromArgb(255, 242, 242, 242);//themeresources.xaml - Light

 private void SetFlyoutBackBrush(Color color)
 {
     var brushKey = "FlyoutBackBrush";
     if (Resources.ContainsKey(brushKey))
     {
        var flyoutbackBrush = Resources[brushKey] as SolidColorBrush;
        if (flyoutbackBrush != null) flyoutbackBrush.Color = color;
     }
 }

 private void Checked(object sender, RoutedEventArgs e)
 {
      this.RequestedTheme = ElementTheme.Dark;
      SetFlyoutBackBrush(_darkColor);
 }

 private void Unchecked(object sender, RoutedEventArgs e)
 {
     this.RequestedTheme = ElementTheme.Light;
     SetFlyoutBackBrush(_lightColor);
 }
弹出式演示器遵循应用程序模式,在应用程序运行时,您不能在代码中更改该模式,但我有两种解决方法:

特定弹出式方法,定义

在App.Xaml资源中定义 定义FlyoutPresenterStyle并使用我们刚才在App.Xaml中定义的笔刷生成背景

        <Flyout x:Name="MyFlyout">
            <Flyout.FlyoutPresenterStyle>
                <Style TargetType="FlyoutPresenter">
                    <Setter Property="Background" Value="{StaticResource FlyoutBackBrush}"/>
                </Style>
            </Flyout.FlyoutPresenterStyle>
            <StackPanel>
                <Button Content="Button"/>
                <TextBlock Text="Test"/>
            </StackPanel>
        </Flyout>
[不推荐]通过从应用程序资源中检索SystemControlBackgroundChromeMediumLowBrush并更改其颜色值的广效方法[可行,但请阅读注释]


请注意,这将影响应用程序中的所有弹出型按钮和选择器,因为它们都使用SystemControlBackgroundChromeMediumLowBrush。

我发现这个问题没有很好的解决方案,但它很简单且有效:

可以将SystemControlBackgroundChromeMediumBrush设置为弹出内容中的网格笔刷

<AppBarButton Label="Szukaj"
                          Icon="Find">
                <AppBarButton.Flyout>
                    <Flyout Placement="Bottom">
                        <Flyout.Content>
                            <Grid Background="{ThemeResource SystemControlBackgroundChromeMediumBrush}"
                                  Margin="-15"
                                  Padding="15"
                                  Width="285">
                                <TextBox Header="Szukaj:"
                                         Width="175"
                                         HorizontalAlignment="Left" />
                                <AppBarButton Label="Szukaj"
                                              Icon="Find"
                                              HorizontalAlignment="Right" />
                            </Grid>
                        </Flyout.Content>
                    </Flyout>
                </AppBarButton.Flyout>
            </AppBarButton>

…请注意设置网格的边距和填充以填充弹出按钮。

检查我的答案并标记它是否解决了您的问题。
 private readonly Color _darkColor = Color.FromArgb(255, 43, 43, 43);//themeresources.xaml - Default

 private readonly Color _lightColor = Color.FromArgb(255, 242, 242, 242);//themeresources.xaml - Light

private void SetFlyoutBackBrush(Color color)
{
    var brushKey = "SystemControlBackgroundChromeMediumLowBrush";
    if (Application.Current.Resources.ContainsKey(brushKey))
    {
        var flyoutbackBrush = Application.Current.Resources[brushKey] as SolidColorBrush;
        if (flyoutbackBrush != null) flyoutbackBrush.Color = color;
    }
}

private void Checked(object sender, RoutedEventArgs e)
{
    this.RequestedTheme = ElementTheme.Dark;
    SetFlyoutBackBrush(_darkColor);
}

private void Unchecked(object sender, RoutedEventArgs e)
{
    this.RequestedTheme = ElementTheme.Light;
    SetFlyoutBackBrush(_lightColor);
}
<AppBarButton Label="Szukaj"
                          Icon="Find">
                <AppBarButton.Flyout>
                    <Flyout Placement="Bottom">
                        <Flyout.Content>
                            <Grid Background="{ThemeResource SystemControlBackgroundChromeMediumBrush}"
                                  Margin="-15"
                                  Padding="15"
                                  Width="285">
                                <TextBox Header="Szukaj:"
                                         Width="175"
                                         HorizontalAlignment="Left" />
                                <AppBarButton Label="Szukaj"
                                              Icon="Find"
                                              HorizontalAlignment="Right" />
                            </Grid>
                        </Flyout.Content>
                    </Flyout>
                </AppBarButton.Flyout>
            </AppBarButton>