如何在程序中将WPF控件的颜色设置为系统颜色,以便在颜色方案更改时更新?

35

我如何在WPF的代码后台中实现这个?

<Grid Background="{DynamicResource {x:Static SystemColors.DesktopBrushKey}}"/>

5
谢谢您发表这个问题。我仍在学习WPF,但我无法弄清如何在XAML中完成此操作,而您的问题正好说明了如何完成。我使用了以下代码:<Grid Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 谢谢! - Pretzel
13
FWIW,您无需定义DynamicResource,可以直接访问静态画刷:Background="{x:Static SystemColors.ControlBrush}"。 - sourcenouveau
5
我修改了之前的评论:如果你认为你的用户会在应用程序运行时更改系统主题,那么你需要指定一个DynamicResource。如果你只是使用{x:Static...},而主题发生了变化,则你的应用程序颜色不会改变以匹配主题。此外,在使用样式的Setter时,例如<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />,需要使用DynamicResource。 - sourcenouveau
4个回答

15

我刚刚找到了一个丑陋的解决方法:

grid1.SetResourceReference(
    Control.BackgroundProperty,
    SystemColors.DesktopBrushKey);

我希望有人能够发布更好的代码(我想看到类似于grid1.Background = BackgroundBrush这样的语法,因为SetResourceReference的语法比Windows Forms退步了一步)。


1
我不认为这很丑。如果你想在代码后台完成它,看起来相当正常。 - Sergey Aldoukhov

9
这一定是因为WPF的较新版本中加入了这个功能,因为您最初发布的代码对我来说正常工作(我正在使用WPF 4.5)。 <Grid Background="{DynamicResource {x:Static SystemColors.DesktopBrushKey}}"/> 的意思是将Grid控件的背景设置为系统桌面颜色。

您似乎误解了问题。OP知道XAML代码是有效的。他正在寻找等效的后台代码,即C#代码。 - Sebastian Negraszus

6

扩展方法可能会有所帮助:

public static class FrameworkElementExtensions
{
    // usage xPanel.SetBackground(SystemColors.DesktopBrushKey);
    public static void SetBackground(this Panel panel, ResourceKey key)
    {
        panel.SetResourceReference(Panel.BackgroundProperty, key);
    }

    // usage xControl.SetBackground(SystemColors.DesktopBrushKey);
    public static void SetBackground(this Control control, ResourceKey key)
    {
        control.SetResourceReference(Control.BackgroundProperty, key);
    }
}

这可以更改为以下内容,因为所有这些都是FrameworkElement类型:<br/> public static class FrameworkElementExtensions { // 用法 xControl.SetBackground(SystemColors.DesktopBrushKey); public static void SetBackground(this FrameworkElement control, ResourceKey key) { control.SetResourceReference(Control.BackgroundProperty, key); } } - Meister Schnitzel

3

1
请注意,除非您侦听更改事件并手动重置它,否则此内容不会在系统颜色更改(例如用户切换到高对比度模式)时更新。 - jt000
SystemColors.GrayTextBrush 是我正在寻找的。 - Flou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接