在WPF应用程序C#中设置所有矩形的背景

时间:2016-03-21 14:23:43

标签: c# wpf xaml colors scalability

我目前在我的应用程序中有一组XAML我在<Rectangle Fill="LightBlue"/> 中定义,如此;

Rectangles

目前我可能&lt; 10 Colour因此更改Rectangle的{​​{1}}并不是一个问题。

然而,随着我的应用程序的增长,我无疑会有更多,更多Rectangles,如果确定他们的颜色需要改变,我可以看到可扩展性将是一个大问题。

存储Background Rectangle的最有效方法是什么,以便我可以在一个地方更改它以更改程序中的所有Rectangles

这也会延伸到一种TextBox的风格。如果我想在整个应用程序中为每个TextBox设置一个自定义样式,那么可扩展的方法是什么?

3 个答案:

答案 0 :(得分:5)

尝试使用样式:

将其插入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>

OR

仅适用于当前Rectangles中的所有Window

<Window.Resources>
    <Style TargetType="Rectangle">
        <Setter Property="Fill" Value="LightBlue" />
    </Style>
</Window.Resources>

注意:

不要指定x:Key,因为您需要为要应用它的每个Style设置RectangleTargetType会将其应用于UI-Elements的所有Type

 <Window.Resources>
    <Style TargetType="Rectangle" x:Key="RectStyle">
        <Setter Property="Fill" Value="LightBlue" />
    </Style>
</Window.Resources>

<Rectangle Style="{StaticResource RectStyle}" />

答案 1 :(得分:2)

我在app.xaml文件中定义应用程序资源中的颜色:

<Application.Resources>
    <SolidColorBrush x:Key="myRectangleBrush" Color="#deadb33f" />
</Application.Resources>

然后你可以像这样使用它:

<Rectangle Fill="{StaticResource myRectangleBrush}" />

这样做的好处是可以将颜色重复用于多种控件。如果您的公司具有您在矩形中使用的颜色配置文件以及某些线条,那么营销部门决定将您的公司颜色更改为不同的颜色。您可以同时为所有矩形和线条更改它。

控件的默认样式是通过向具有目标类型属性且没有键属性的应用程序资源添加样式来实现的。

答案 2 :(得分:0)

为了动态更改WPF窗口的主题,您可以创建多个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>

然后在主窗口XAML

中引用默认主题(例如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事件)在主题(例如&#34; 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) }
    );
}