1

我试图超越基本样式属性,但在运行时。例如,我有一个设置页面,允许用户更改字体大小和字体系列等。所有这些都是常见的属性。所以,我有一个定义了所有这些基本属性的结构。现在,当我将字体大小从 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>

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

4

1 回答 1

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

在此处输入图像描述

如果您有许多不同类型的控件,那么最好通过选择一些共同点(例如:宽度、高度、对齐方式)为每个控件创建一个基本样式。例如,基础样式为Button,TextBox等。它们的控件与基础有很大不同,您应该创建一个单独的样式来继承基础。

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";
    }
}
于 2013-08-19T05:43:02.403 回答