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}}" />

posted @ 2012-05-04 13:29  帅帅的蓝莓  阅读(492)  评论(0)    收藏  举报