繁体   English   中英

WPF / C#, 如何将主 window 的背景颜色更改为另一个 window?

[英]WPF / C# , How to change the background color of the main window from another window?

我写了一个WPF程序,我想使用设置 window更改主要 window 的背景颜色 项目要求: 1- 设置 window 应该能够将 colors 保存在变量中,并在再次打开设置 window 时再次显示这些 colors。 2- 主window的背景色要和设置window中的colors完美绑定,修改后立即应用。

我的 WPF 项目

我尝试了几种方法,包括: 1- 我在主要 window 后面的代码中定义了一个 LinearGradientBrush 类型的全局变量。 2- 我在 app.xaml 文件中定义了一个 LinearGradientBrush 类型的全局变量。

但是这些方法都不能正常工作

  1. 您基本上必须定义画笔资源。 此示例将在App.xaml中定义此资源。
    将其命名为例如“MainWindowBackgroudBrush”:
<ResourceDictionary>
  <SolidColorBrush x:Key="MainWindowBackgroudBrush"
                   Color="Orange" />
</ResourceDictionary>
  1. 使用DynamicResource从您的MainWindow (或通常应该具有动态背景的Control )引用此资源。 DynamicResource表示引用的资源预计会在运行时发生变化(即资源是动态的):
<Window Background="{DynamicResource MainWindowBackgroudBrush}">
</Window>
  1. 然后从任何地方修改画笔资源,例如,从您的SettingsWindow使用 static Application.Current属性:
Application.Current.Resources["MainWindowBackgroudBrush"] = Brushes.Red;

GradientBrush的情况下,或者当您想要更改Brush的 colors 时,您必须动态创建和替换一个完整的新Brush或仅引用Color而不是完整的Brush

为了允许从例如您的图书馆的客户(他们通常不知道实际的资源密钥)修改动态资源,您将定义一个static ComponentResourceKey ,您将使用它代替魔术字符串(用于注册和引用资源)。

应用程序.xaml.cs

partial class App : Application
{
  public static ComponentResourceKey StartColorKey { get; } = new ComponentResourceKey(typeof(App), "StartColor");
  public static ComponentResourceKey EndColorKey { get; } = new ComponentResourceKey(typeof(App), "EndColor");
}

申请.xaml

<ResourceDictionary>
  <Color x:Key="{x:Static local:App.StartColorKey}">Orange</Color>
  <Color x:Key="{x:Static local:App.EndColorKey}">Green</Color>

  <!-- Example on how to create brushes from Color resources -->
  <SolidColorBrush x:Key="MainWindowBackgroundBrush"
                   Color="{StaticResource {x:Static local:App.StartColorKey}}" />
</ResourceDictionary>

主窗口.xaml

<Window>
  <Window.Background>
    <LinearGradientBrush EndPoint="0.5,1"
                         StartPoint="0.5,0">
      <GradientStop Color="{DynamicResource {x:Static local:App.StartColorKey}}"
                    Offset="0" />
      <GradientStop Color="{DynamicResource {x:Static local:App.EndColorKey}}"
                    Offset="1"/>
    </LinearGradientBrush>
  </Window.Background>
</Window>
// Replace the resource at runtime
Application.Current.Resources[App.StartColorKey] = Brushes.Red;

评论

因为DynamicResource指示 XAML 引擎显式跟踪引用资源的更改,所以引擎不会跟踪对被跟踪资源的嵌套对象(例如LinearGradientBrush.GradientStopes.GradientStop )属性的更改。

出于这个原因,以下示例将不起作用:对由SolidColorBrush引用的动态Color资源的更改将不会被引用此SolidColorBrush的元素检测到(因为SolidColorBrush资源本身没有更改。只有嵌套属性SolidColorBrush.Color .颜色): SolidColorBrush.Color

<ResourceDictionary>
  <Color x:Key="ButtonBackgroundColor}">Orange</Color>

  <SolidColorBrush x:Key="ButtonBackgroundBrush"
                   Color="{DynamicResource ButtonBackgroundColor}" />
</ResourceDictionary>

主窗口.xaml

<Window>
  <Button Background="{DynamicResource ButtonBackgroundBrush}" />
</Window>

要使其工作,您必须直接引用动态资源。 这样 XAML 引擎将跟踪更改。 您通过定义引用 object 来执行此操作,在本例中为SolidColorBrush ,内联: App.xaml

<ResourceDictionary>
  <Color x:Key="ButtonBackgroundColor}">Orange</Color>

  <SolidColorBrush x:Key="ButtonBackgroudBrush"
                   Color="{DynamicResource ButtonBackgroundColor}" />
</ResourceDictionary>

主窗口.xaml

<Window>
  <Button>
    <Button.Background>
      <SolidColorBrush Color="{DynamicResource ButtonBackgroundColor}" />
    </Button.Background>
  </Button>
</Window>

这对于像GradientBrush这样的复杂对象特别有用,当嵌套属性引用的资源发生变化时,您希望避免在其中构建完整的 object。

经过一番搜索,我找到了一个完全符合我脑海中想象的项目。 我把项目的源链接放在这里。

项目解决方案

第一个项目预览

在 visual studio go 到你的属性 window。导航到设置,添加一个颜色类型的参数,如果你改变你的颜色,现在给它一个像 yourColor 的名字,将它存储在设置文件中:

properties.settings.default.yourColor = newBackgroundColor;
properties.settings.default.save();

Wenn 你启动你 window 查看你的属性并将其用作背景。

this.background = properties.settings.default.yourColor;

(伪代码不会编译)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM