我试图在运行时过度使用基本样式属性。 对于例如我有一个设置页面,我允许用户更改字体大小和字体系列等。所有这些都是常见的属性。所以,我有一个结构,我已经定义了所有这些基本属性。现在,当我将字体大小从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>
现在,当我从应用程序中的这个组合框中选择一个值时,我将不得不更新基本样式。这是我无法做到的。关于如何实现这一点的任何建议。所有属性更改都应该动态发生。
答案 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
如果您有很多不同类型的控件,那么最好通过选择共同的东西(例如:宽度,高度,对齐)为每个控件创建基本样式。例如,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";
}
}