[英]C# wpf how to get data bind value from another class(user control) in main 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完美绑定,修改后立即应用。
我尝试了几种方法,包括: 1- 我在主要 window 后面的代码中定义了一个 LinearGradientBrush 类型的全局变量。 2- 我在 app.xaml 文件中定义了一个 LinearGradientBrush 类型的全局变量。
但是这些方法都不能正常工作
<ResourceDictionary>
<SolidColorBrush x:Key="MainWindowBackgroudBrush"
Color="Orange" />
</ResourceDictionary>
DynamicResource
从您的MainWindow
(或通常应该具有动态背景的Control
)引用此资源。 DynamicResource
表示引用的资源预计会在运行时发生变化(即资源是动态的):<Window Background="{DynamicResource MainWindowBackgroudBrush}">
</Window>
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.