Wpf中的style
一般要使几个控件拥有相同的外观,如果不用style或指定资源的话,只能ctrl+c和ctrl+v了
比如要实现下面的Button 外观

我们可以直接使用样式来规范它
buttonStyle
1 <StackPanel Orientation="Horizontal" Height="246" Width="495"> 2 <StackPanel.Resources> 3 <Style x:Key="buttonStyle"> 4 <Setter Property="Button.FontSize" Value="22"></Setter> 5 <Setter Property="Button.Background" Value="Purple"></Setter> 6 <Setter Property="Button.Foreground" Value="White"></Setter> 7 <Setter Property="Button.Margin" Value="10,0"></Setter> 8 <Setter Property="Button.Height" Value="50"></Setter> 9 <Setter Property="Button.Width" Value="50"></Setter> 10 <Setter Property="Button.RenderTransformOrigin" Value=".5,.5"></Setter> 11 <Setter Property="Button.RenderTransform"> 12 <Setter.Value> 13 <RotateTransform Angle="10"></RotateTransform> 14 </Setter.Value> 15 </Setter> 16 </Style><!--基本的样式--> 17 <Style x:Key="BoldButton" BasedOn="{StaticResource buttonStyle}"> 18 <Setter Property="Button.FontWeight" Value="Bold"></Setter> 19 </Style><!--字体加粗的样式,继承于上面--> 20 </StackPanel.Resources> 21 <Button Style="{StaticResource BoldButton}">1</Button> 22 <Button Style="{StaticResource BoldButton}">2</Button> 23 <Button Style="{StaticResource BoldButton}">3</Button> 24 </StackPanel>
其中的Button引用的是BoldButton样式,而BoldButton自己就实现了字体的加粗,替他的都是用BaseOn属性从
buttonStyle继承而来的.
当然这只是对Button样式,如果把Button.xxx改为Control.xxx会怎么样呢?它(样式)会变成对所有的Control使用样式了,代码和结果如下
ControlStyle
1 <StackPanel Orientation="Horizontal" Height="246" Width="495"> 2 <StackPanel.Resources> 3 <Style x:Key="ControlStyle"> 4 <Setter Property="Control.FontSize" Value="22"></Setter> 5 <Setter Property="Control.Background" Value="Purple"></Setter> 6 <Setter Property="Control.Foreground" Value="White"></Setter> 7 <Setter Property="Control.Margin" Value="10,0"></Setter> 8 <Setter Property="Control.Height" Value="50"></Setter> 9 <Setter Property="Control.Width" Value="50"></Setter> 10 <Setter Property="Control.RenderTransformOrigin" Value=".5,.5"></Setter> 11 <Setter Property="Control.RenderTransform"> 12 <Setter.Value> 13 <RotateTransform Angle="10"></RotateTransform> 14 </Setter.Value> 15 </Setter> 16 </Style><!--基本的样式--> 17 <Style x:Key="ControlBold" BasedOn="{StaticResource ControlStyle}"> 18 <Setter Property="Control.FontWeight" Value="Bold"></Setter> 19 </Style><!--字体加粗的样式,继承于上面--> 20 </StackPanel.Resources> 21 <Button Style="{StaticResource ControlBold}">1</Button> 22 <ComboBox Style="{StaticResource ControlBold}"> 23 <ComboBox.Items>2</ComboBox.Items> 24 </ComboBox> 25 <Expander Style="{StaticResource ControlBold}" Content="3"></Expander> 26 <TabControl Style="{StaticResource ControlBold}"> 27 <TabControl.Items>4</TabControl.Items> 28 </TabControl> 29 <ToolBar Style="{StaticResource ControlBold}"> 30 <ToolBar.Items>5</ToolBar.Items> 31 </ToolBar> 32 <InkCanvas Style="{StaticResource ControlBold}"></InkCanvas> 33 <TextBox Style="{StaticResource ControlBold}" Text="7"></TextBox> 34 </StackPanel>

如果你复制xaml的话,结果可能不是和上面一样,因为2是我选择了下拉,3是点击了展开,6是画上去的!
如果style里面的一些属性设置,某些控件没有会怎么样呢?会忽略它!像InkCanvas就没有Foreground和FontSize属性.
如果你的ComBox不想要紫色的Background怎么办?直接用本地值就好了(Background = "Red"),因为本地的优先级比任何的Style设置都高.
限制Style的使用,可以设置TargetType属性来解决,像在style的后面加上 TargetType="{x:Type Button}",这样除Button以外的控件用这个Style时,就会发生异常了.另外加上了TargetType="{x:Type Button}",就可以像Button.Width一样所有的前缀Button了....
最后来说一下隐式的Style,也就是创建的时候不加x:Key的情况,它的意思就是在全局(在StackPanel资源下,就是StackPanel内,在Window资源下,就是Window内)默认使用这个样式,但是用一个x:Type只能有一个隐式的Style,否则会报错.隐式的不是没有键名,其实键名就是Style的TargetType属性.可以显示的访问哦,如下:
<Button Style="{StaticResource {x:Type Button}}" />
                    
                

                
            
        
浙公网安备 33010602011771号