在 WPF 应用程序 C# 中设置所有矩形的背景
Set the Background of all Rectangles in a WPF App C#
我目前在我的应用程序中有一组 Rectangles
,我在 XAML
中这样定义;
<Rectangle Fill="LightBlue"/>
目前我可能 < 10 Rectangles
所以更改 Rectangle
的 Colour
不是什么大问题。
然而,随着我的应用程序的增长,我无疑会拥有更多 Rectangles
,如果决定它们的颜色需要改变,我可以看到可扩展性将是一个大问题。
存储 Rectangle
的 Background
的最有效方法是什么,以便我可以在一个地方更改它以更改程序中的所有 Rectangles
?
这也可以扩展到 TextBox
的风格。如果我想为整个应用程序中的每个 TextBox
设置一个自定义样式,什么是可扩展的方法?
尝试使用样式:
将其插入您的 app.xaml
以影响所有 Windows 中的所有 Rectangles
。
<Application.Resources>
<!-- Use the Color ala "Lorentz Vedeler" to make it reusable -->
<SolidColorBrush x:Key="myRectangleBrush" Color="LightBlue" />
<!-- Apply it in Style -->
<Style TargetType="Rectangle">
<Setter Property="Fill" Value="{StaticResource myRectangleBrush}" />
</Style>
</Application.Resources>
或
对于当前 Window
中的所有 Rectangles
。
<Window.Resources>
<Style TargetType="Rectangle">
<Setter Property="Fill" Value="LightBlue" />
</Style>
</Window.Resources>
注意:
不要指定 x:Key
,因为您需要为每个要应用它的 Rectangle
设置 Style
。 TargetType
会将其应用于 Type
中的所有 UI-Elements
。
<Window.Resources>
<Style TargetType="Rectangle" x:Key="RectStyle">
<Setter Property="Fill" Value="LightBlue" />
</Style>
</Window.Resources>
<Rectangle Style="{StaticResource RectStyle}" />
我会在 app.xaml- 文件的应用程序资源中定义颜色:
<Application.Resources>
<SolidColorBrush x:Key="myRectangleBrush" Color="#deadb33f" />
</Application.Resources>
那么你可以这样使用它:
<Rectangle Fill="{StaticResource myRectangleBrush}" />
这样做的好处是您可以为多种控件重复使用该颜色。如果您的公司有您在矩形和某些线条中使用的颜色配置文件,那么市场营销决定将您的公司颜色更改为不同的阴影。您可以同时更改所有矩形和线条。
控件的默认样式是通过向具有目标类型属性但不具有键属性的应用程序资源添加样式来创建的。
为了动态更改 WPF Window 的主题,您可以创建几个 ResourceDictionary
文件然后放置,例如在文件夹 Themes
中:
清单 1. ResourceDictionary 文件 (XAML)
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
... SAMPLE STYLES
<Style TargetType="Rectangle">
<Setter Property="Fill" Value="Green" />
</Style>
<Style TargetType="TextBox">
<Setter Property="Background" Value="Green"/>
</Style>
</ResourceDictionary>
然后在主WindowXAML
中参考默认主题(例如Blue.xaml)
清单 2. 在 Window XAML
中设置默认主题
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Themes\Blue.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
并在后面的 C# 代码中使用 Window 的 Control
事件处理程序(例如 Button.Click 事件)在主题之间动态切换(例如到“Green.xaml”)模块:
清单 3. 动态设置 WPF Window Theme ResourceDictionary
/// <summary>
/// Dynamically set WPF Window Theme resource dictionary
/// </summary>
private void SelectGreenTheme()
{
// prefix to the relative Uri for Theme resources (xaml file)
string _prefix = String.Concat(typeof(App).Namespace, ";component/");
// clear all resource dictionaries in this window
// Note: on app level use: Application.Current.Resources.MergedDictionaries.Clear();
this.Resources.MergedDictionaries.Clear();
// add resource theme dictionary to this window
// Note: on app level use: Application.Current.Resources.MergedDictionaries.Add
this.Resources.MergedDictionaries.Add
(
new ResourceDictionary { Source = new Uri(String.Concat(_prefix + "Themes\Green.xaml, UriKind.Relative) }
);
}
我目前在我的应用程序中有一组 Rectangles
,我在 XAML
中这样定义;
<Rectangle Fill="LightBlue"/>
目前我可能 < 10 Rectangles
所以更改 Rectangle
的 Colour
不是什么大问题。
然而,随着我的应用程序的增长,我无疑会拥有更多 Rectangles
,如果决定它们的颜色需要改变,我可以看到可扩展性将是一个大问题。
存储 Rectangle
的 Background
的最有效方法是什么,以便我可以在一个地方更改它以更改程序中的所有 Rectangles
?
这也可以扩展到 TextBox
的风格。如果我想为整个应用程序中的每个 TextBox
设置一个自定义样式,什么是可扩展的方法?
尝试使用样式:
将其插入您的 app.xaml
以影响所有 Windows 中的所有 Rectangles
。
<Application.Resources>
<!-- Use the Color ala "Lorentz Vedeler" to make it reusable -->
<SolidColorBrush x:Key="myRectangleBrush" Color="LightBlue" />
<!-- Apply it in Style -->
<Style TargetType="Rectangle">
<Setter Property="Fill" Value="{StaticResource myRectangleBrush}" />
</Style>
</Application.Resources>
或
对于当前 Window
中的所有 Rectangles
。
<Window.Resources>
<Style TargetType="Rectangle">
<Setter Property="Fill" Value="LightBlue" />
</Style>
</Window.Resources>
注意:
不要指定 x:Key
,因为您需要为每个要应用它的 Rectangle
设置 Style
。 TargetType
会将其应用于 Type
中的所有 UI-Elements
。
<Window.Resources>
<Style TargetType="Rectangle" x:Key="RectStyle">
<Setter Property="Fill" Value="LightBlue" />
</Style>
</Window.Resources>
<Rectangle Style="{StaticResource RectStyle}" />
我会在 app.xaml- 文件的应用程序资源中定义颜色:
<Application.Resources>
<SolidColorBrush x:Key="myRectangleBrush" Color="#deadb33f" />
</Application.Resources>
那么你可以这样使用它:
<Rectangle Fill="{StaticResource myRectangleBrush}" />
这样做的好处是您可以为多种控件重复使用该颜色。如果您的公司有您在矩形和某些线条中使用的颜色配置文件,那么市场营销决定将您的公司颜色更改为不同的阴影。您可以同时更改所有矩形和线条。
控件的默认样式是通过向具有目标类型属性但不具有键属性的应用程序资源添加样式来创建的。
为了动态更改 WPF Window 的主题,您可以创建几个 ResourceDictionary
文件然后放置,例如在文件夹 Themes
中:
清单 1. ResourceDictionary 文件 (XAML)
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
... SAMPLE STYLES
<Style TargetType="Rectangle">
<Setter Property="Fill" Value="Green" />
</Style>
<Style TargetType="TextBox">
<Setter Property="Background" Value="Green"/>
</Style>
</ResourceDictionary>
然后在主WindowXAML
中参考默认主题(例如Blue.xaml)清单 2. 在 Window XAML
中设置默认主题<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Themes\Blue.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
并在后面的 C# 代码中使用 Window 的 Control
事件处理程序(例如 Button.Click 事件)在主题之间动态切换(例如到“Green.xaml”)模块:
清单 3. 动态设置 WPF Window Theme ResourceDictionary
/// <summary>
/// Dynamically set WPF Window Theme resource dictionary
/// </summary>
private void SelectGreenTheme()
{
// prefix to the relative Uri for Theme resources (xaml file)
string _prefix = String.Concat(typeof(App).Namespace, ";component/");
// clear all resource dictionaries in this window
// Note: on app level use: Application.Current.Resources.MergedDictionaries.Clear();
this.Resources.MergedDictionaries.Clear();
// add resource theme dictionary to this window
// Note: on app level use: Application.Current.Resources.MergedDictionaries.Add
this.Resources.MergedDictionaries.Add
(
new ResourceDictionary { Source = new Uri(String.Concat(_prefix + "Themes\Green.xaml, UriKind.Relative) }
);
}