动态更改基本样式

时间:2013-08-19 04:51:50

标签: c# wpf xaml

我试图在运行时过度使用基本样式属性。 对于例如我有一个设置页面,我允许用户更改字体大小和字体系列等。所有这些都是常见的属性。所以,我有一个结构,我已经定义了所有这些基本属性。现在,当我将字体大小从11px更改为14px时,应用程序中的所有元素都应继承此更改。

问题是我无法修改存储所有属性的基本样式。

下面的代码显示了我的基本风格:

<Style x:Key="BaseStyle">
        <Setter Property="Control.FontFamily" Value="Arial"></Setter>
        <Setter Property="Control.FontSize" Value="11px"/>
        <Setter Property="Control.Foreground" Value="Red"/>
</Style>

现在我有另一种继承自这种基本风格的风格:

 <Style TargetType="TextBox" BasedOn="{StaticResource BaseStyle}">
       <Setter Property="Control.Background" Value="{DynamicResource NormalBrush}"/>
 </Style>

在应用程序中,我有一个用于更改字体大小的组合框:

<ComboBox Height="23" HorizontalAlignment="Left" Name="comboBox2" SelectedValue="FontSizeValue" Style="{x:Null}" Width="92">
                        <ComboBoxItem Content="12px"/>
                        <ComboBoxItem Content="13px"/>
                        <ComboBoxItem Content="14px"/>
                        <ComboBoxItem Content="15px"/>
</ComboBox>

现在,当我从应用程序中的这个组合框中选择一个值时,我将不得不更新基本样式。这是我无法做到的。关于如何实现这一点的任何建议。所有属性更改都应该动态发生。

1 个答案:

答案 0 :(得分:1)

基本样式应该是此类控件不会更改的值。需要更改的值以单独的样式指定,该样式可以继承基础。例如:

<Window.Resources>
    <!-- Main style for all controls -->
    <Style x:Key="BaseStyle" TargetType="{x:Type Control}">
        <Setter Property="FontFamily" Value="Arial" />
        <Setter Property="FontSize" Value="11px" />
        <Setter Property="Foreground" Value="Black" />
        <Setter Property="Width" Value="200" />
        <Setter Property="Height" Value="25" />
    </Style>

    <!-- This style inherits all the settings from the base style, but set the background -->
    <Style x:Key="DefaultBaseStyle" BasedOn="{StaticResource BaseStyle}" TargetType="{x:Type TextBox}">
        <Setter Property="Background" Value="Green" />
    </Style>

    <!-- This style inherits only the width and height -->
    <Style x:Key="NotDefaultBaseStyle" BasedOn="{StaticResource BaseStyle}" TargetType="{x:Type TextBox}">
        <Setter Property="Background" Value="Black" />
        <Setter Property="Foreground" Value="White" />
        <Setter Property="FontFamily" Value="Courier New" />
    </Style>
</Window.Resources>

<Grid>
    <StackPanel>
        <TextBox Style="{StaticResource DefaultBaseStyle}" Text="Default base style" Margin="0,10,0,0" />
        <TextBox Style="{StaticResource NotDefaultBaseStyle}" Text="Not default base style" Margin="0,10,0,0" />
    </StackPanel>
</Grid>

Output

enter image description here

如果您有很多不同类型的控件,那么最好通过选择共同的东西(例如:宽度,高度,对齐)为每个控件创建基本样式。例如,ButtonTextBox等的基本样式。并且它们控制与基础有很大不同,您应该创建一个继承基础的单独样式。

<强> EDIT:

如果您希望根据用户的选择更改样式,则需要使用这些参数创建设置。所以,进入项目的设置:

Project -> Properties -> Parameters

创建名称为MyColor的字符串类型的设置。要与设置的样式相关联,您需要编写以下内容:

xmlns:properties="clr-namespace:DynamicStyleHelp.Properties"

<Setter Property="Background" Value="{Binding Source={x:Static properties:Settings.Default}, Path=MyColor, Mode=TwoWay}" />

现在,setter指的是设置中的值。更改代码背后的属性:

// your namespace.Properties.Settings.Default.your name of property
DynamicStyleHelp.Properties.Settings.Default.MyColor = "Red";   

以下是一个完整的例子:

XAML

<Window x:Class="DynamicStyleHelp.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:properties="clr-namespace:DynamicStyleHelp.Properties"
    Title="MainWindow" Height="350" Width="525"
    WindowStartupLocation="CenterScreen">

<Window.Resources>
    <Style x:Key="BaseStyle" TargetType="{x:Type Control}">
        <Setter Property="FontFamily" Value="Arial" />
        <Setter Property="FontSize" Value="11px" />
        <Setter Property="Background" Value="{Binding Source={x:Static properties:Settings.Default}, Path=MyColor, Mode=TwoWay}" />
        <Setter Property="Width" Value="200" />
        <Setter Property="Height" Value="25" />
    </Style>

    <Style x:Key="DefaultBaseStyle" BasedOn="{StaticResource BaseStyle}" TargetType="{x:Type TextBox}">
        <Setter Property="Foreground" Value="Black" />
    </Style>

    <Style x:Key="NotDefaultBaseStyle" BasedOn="{StaticResource BaseStyle}" TargetType="{x:Type TextBox}">
        <Setter Property="Foreground" Value="White" />
        <Setter Property="FontFamily" Value="Courier New" />
    </Style>
</Window.Resources>

<Grid>
    <StackPanel>
        <TextBox Style="{StaticResource DefaultBaseStyle}" Text="Default base style" Margin="0,10,0,0" />
        <TextBox Style="{StaticResource NotDefaultBaseStyle}" Text="Not default base style" Margin="0,10,0,0" />

        <Button Name="ChangeButton" Width="100" Height="30" Content="ChangeButton" Margin="0,10,0,0" Click="ChangeButton_Click" />
    </StackPanel>
</Grid>
</Window>

Code behind

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void ChangeButton_Click(object sender, RoutedEventArgs e)
    {
        DynamicStyleHelp.Properties.Settings.Default.MyColor = "Red";
    }
}