【问题标题】:How can I set a WPF control's color to a system color programmatically, so that it updates on color scheme changes?如何以编程方式将 WPF 控件的颜色设置为系统颜色,以便在颜色方案更改时更新?
【发布时间】:2017-04-11 00:37:08
【问题描述】:

如何在 WPF 的代码隐藏中做到这一点?

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

【问题讨论】:

  • 感谢您发布此问题。我仍在学习 WPF,但我无法弄清楚如何在 XAML 中执行此操作,但您的问题确切地显示了如何执行此操作。我改用这个: 谢谢!
  • FWIW不需要定义DynamicResource,可以直接访问静态画笔:Background="{x:Static SystemColors.ControlBrush}"
  • 我修改了我之前的评论:如果您认为您的用户会在您的应用程序运行时更改系统主题,您确实需要指定一个 DynamicResource。如果您只使用 {x:Static ... } 并且主题更改,您的应用程序颜色将不会更改以匹配。使用 Style 的 Setter 时也需要 DynamicResource,例如.

标签: c# wpf


【解决方案1】:

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

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

我希望有人能发布一个更好的(我希望看到类似 grid1.Background = BackgroundBrush,因为 SetResourceReference 的语法是从 Windows 窗体倒退了一步)。

【讨论】:

  • 我不认为这很丑。如果你想在后面的代码中这样做,看起来很正常。
【解决方案2】:

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

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类型:
    public static class FrameworkElementExtensions { // usage xControl.SetBackground(SystemColors.DesktopBrushKey); public static void SetBackground(this FrameworkElement control, ResourceKey key) { control.SetResourceReference(Control.BackgroundProperty, key); } }
【解决方案3】:

这必须已添加到更高版本的 WPF 中,因为这是最初发布的,因为您的原始代码对我来说很好(我使用的是 WPF 4.5)

&lt;Grid Background="{DynamicResource {x:Static SystemColors.DesktopBrushKey}}"/&gt;

【讨论】:

  • 您似乎误解了这个问题。 OP 知道 XAML 代码有效。他正在寻找等效的代码隐藏,即 C# 代码。
【解决方案4】:

【讨论】:

  • 请注意,当系统颜色发生变化时,例如用户切换到高对比度模式时,这不会更新,除非您监听更改事件并手动重置。
  • SystemColors.GrayTextBrush 是我要找的
猜你喜欢
  • 2018-10-26
  • 2015-12-06
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多