http://www.cnblogs.com/shuang121/archive/2013/01/14/2860455.html

前面简单的说到了wpf中几种样式的用法,wpf有着类似web中的CSS一样,为界面上的元素定制外观,以提供更好的用户界面,这种灵活性也是winForm所不能及的,从前面讲到的可以知道在WPF应用程序中,通过控件的属性,我们也可以实现更改控件的外观。但是,这种方式局限性大、不灵活且不利于维护,比如一个,二个按钮的样式可以这样,如果有二十,三十个,甚至更多,难道也这样吗,显然这不是很好的选择,如果我们将上述控件的属性归纳起来,写到一段样式中,为按钮指定该样式(甚至用元素类型样式时,都不需要指定按钮样式),所有按钮就具有统一样式和外观了。如果想修改按钮外观,我们只需要改一下样式代码即可,所有按钮外观都会随之变化。

样式的使用有多种方法,如内联样式(定义在元素内部)、已命名样式(为样式命名,使用时通过名称引用)、元素类型样式(为一种类型的元素,指定一种样式)等等。

一、内联样式

比如下面的为textBox加样式

  1. <TextBox Text="内容">
  2. <TextBox.Style>
  3. <Style>
  4. <Setter Property="TextBox.FontSize" Value="16"></Setter>
  5. <Setter Property="TextBox.Width" Value="80"></Setter>
  6. <Setter Property="TextBox.Height" Value="40"></Setter>
  7.  
  8. </Style>
  9. </TextBox.Style>
  10. </TextBox>

就是说,我们可以通过在元素内部通过拓展属性Style来定义样式。但是缺点也是显而易见的,如果有多个这样的控件指向同一个样式,该怎么办呢,只能每个都要写,所以很不好,所以我们可以在资源中定义一个样式,然后让多个控件调用这一个样式即可

二、已命名样式

 将相同的内敛样式归纳起来,放入资源中,构成一个样式,并为它起一个名字。这样,就可以通过名字为元素指定该样式。

  1. <Window.Resources>
  2. <Style x:Key="buttonStyle">
  3. <Setter Property="Foreground" Value="#999999"/>
  4. </Style>
  5.  
  6. </Window.Resources>

然后调用即可

  1. <Button Content="Button" Height="23" Style="{StaticResource buttonStyle}"
    HorizontalAlignment="Left" Margin="10,204,0,0" Name="button5" VerticalAlignment="Top" Width="75" />

如果给样式指定一种类型,则属性中的名字可以去掉,加上指定目标类型(TargetType)

  1. <Window.Resources>
  2. <Style x:Key="buttonStyle" TargetType="{x:Type Button}">
  3. <Setter Property="Foreground" Value="#999999"/>
  4. </Style>
  5. </Window.Resources>

 上述中的TargetType可以改成Control ,因为Button是从Control派生而来的。

如果其他控件也是派生自Control可以将Style1指定给这些控件也是合适的。这样就能使多种元素共用一种样式。

如:

  1. <Window.Resources>
  2. <Style x:Key="Style1" TargetType="{x:Type Control }">
  3. <Setter Property="FontSize" Value="16"></Setter> <Setter Property="Width" Value="180"></Setter>
  4. <Setter Property="Height" Value="30">
  5. </Setter>
  6. </Style>
  7. </Window.Resources>
  8. <Grid>
  9. <Button Style="{StaticResource Style1}" Margin="23,32,95,139">Button1</Button>
  10. <CheckBox Style="{StaticResource Style1}" Margin="23,130,95,41">Checkbox1</CheckBox>
  11. </Grid>

 Button、Check可以使用Style1,而TextBlock则不行,原因是TextBlock不是派生自Control。

重用样式(Reusing Styles)

  重用样式指的是,样式可以拥有目标所没有的属性。比如,我们想定义一种样式,其中含有不想被所有元素共享的属性,而只希望这些非共享属性应用到特定的元素上。这时,我们就可以去掉目标类型,重新加上前缀。

  1. <Window.Resources>
  2. <Style x:Key="Style1">
  3. <Setter Property="CheckBox.FontSize" Value="16"></Setter>
  4. <Setter Property="Button.Foreground" Value="Red"></Setter>
  5. <Setter Property="CheckBox.IsChecked" Value="True"></Setter>
  6. </Style>
  7. </Window.Resources>
  8. <Grid>
  9. <CheckBox Style="{StaticResource Style1}" Margin="23,32,95,139">Button1</CheckBox>
  10. <TextBlock Style="{StaticResource Style1}">TextBlock1</TextBlock>
  11. </Grid>

 将Style1同时指定给CheckBox1和TextBlock1,TextBlocak会自动忽略不适用它们自身的样式属性IsChecked。而二者公有的属性(比如Foreground、FontSize),不论加不加前缀,对二者都有效。

重写样式(Overriding Style)

  重写样式属性类似于面向对象中的重写,其效果也类似于CSS中的样式覆盖。最终的外观取决于最近的样式或者属性。比如,给一个元素指定了一个样式,其中包含FontSize属性值为14。而在元素定义时,重新给它的属性FontSize设置了一个值18。最终元素文本的FontSize将为18。

  1. <Window.Resources>
  2. <Style x:Key="Style1">
  3. <Setter Property="Button.FontSize" Value="14"></Setter>
  4. </Style>
  5. </Window.Resources>
  6. <Grid>
  7. <Button Width="80" Height="30" FontSize="18">Button1</Button>
  8. </Grid>

 拓展样式(Extending Styles)

  可以对现有样式进行拓展,类似于面向对象中的继承或派生,可以在添加新的属性或者重载已存在的属性。

  1. <Window.Resources>
  2. <Style x:Key="Style1" TargetType="Button">
  3. <Setter Property="FontSize" Value="16"></Setter>
    <Setter Property="Foreground" Value="Red"></Setter> </Style>
  4. <Style x:Key="Style2" BasedOn="{StaticResource Style1}" TargetType="Button">
  5. <!--添加新属性-->
  6. <Setter Property="FontWeight" Value="Bold"></Setter>
  7. <!--重载-->
  8. <Setter Property="Foreground" Value="Yellow"></Setter>
    </Style> </Window.Resources> <Grid>
  9. <Button Style="{StaticResource Style1}" Width="80" Height="30" FontSize="18" Margin="109,55,109,116">Button1</Button>
    <Button Style="{StaticResource Style2}" Width="80" Height="30" FontSize="18" Margin="109,120,109,51">Button2</Button>
    </Grid>

三、元素类型样式

 一般来说,我们希望用户界面上的控件拥有统一外观,比如所有按钮大小相同、颜色一致等,这时我们可以定义一种元素的样式,对一个范围内的所有元素都有效,这就是元素类型样式。

  同一类型元素共享外观

  倘若希望一个顶级窗口内所有的元素,具有相同的样式和外观——可以这样实现:1.在顶级窗口资源中定义一个样式,不标记x:Key,将TargetType设置为一种元素类型。2.定义元素,不用指定Style,窗口中所有该类型的元素,都将使用资源中定义的样式,并具有统一外观。

  1. <Window.Resources>
  2. <!--Button 样式-->
  3. <Style TargetType="{x:Type Button}">
  4. <Setter Property="FontWeight" Value="Normal"></Setter>
  5. <Setter Property="Foreground" Value="Green"></Setter>
    </Style>
  6. <!--TextBlock 样式-->
  7. <Style TargetType="TextBlock">
  8. <Setter Property="FontSize" Value="16"></Setter>
    <Setter Property="Foreground" Value="Red"></Setter>
    </Style>
    </Window.Resources>
    <Grid>
  9. <Button Name="Button1" Width="80" Height="30" Margin="46,41,172,130">Button1</Button>
  10. <Button Name="Button2" Width="80" Height="30" Margin="46,90,172,80">Button2</Button>
  11. <TextBlock Name="TextBlock1" Margin="164,41,38,0" Height="30" VerticalAlignment="Top">TextBlock1</TextBlock>
    <TextBlock Name="TextBlock2" Margin="164,90,38,80">TextBlock2</TextBlock>
  12. </Grid>

 作用范围

  以上的共享外观不仅仅局限于顶级窗口,而是根据你定义的样式所在的范围。如果你将样式定义在一个面板资源中,共享外观将仅仅作用该面板。

  窗口范围(作用于该窗口)

  1. <Window ...>
  2. <Window.Resources>
  3. <!--Button 样式-->
  4. <Style TargetType="{x:Type Button}">
  5. <Setter Property="Foreground" Value="Green"></Setter>
  6. </Style>
  7. </Window.Resources>
  8. </Window>

面板范围(作用于该面板)

  1. <Grid>
  2. <Grid.Resources>
  3. <!--Button 样式-->
  4. <Style TargetType="{x:Type Button}">
  5. <Setter Property="Foreground" Value="Green"></Setter>
  6. </Style>
  7. </Grid.Resources>
  8. <!---->
  9. </Grid>

 应用程序范围(作用于该应用程序)

  1. <Application ...>
  2. <Application.Resources>
  3. <!--Button 样式-->
  4. <Style TargetType="{x:Type Button}">
  5. <Setter Property="Foreground" Value="Green">
  6. </Setter>
  7. </Style>
  8. </Application.Resources>
  9. </Application>  

四、编程控制样式

通过代码更改按钮Button1的样式:

  1. <Window.Resources>
  2. <!--Style1-->
  3. <Style x:Key="Style1" TargetType="{x:Type Button}">
  4. <Setter Property="FontWeight" Value="Normal"></Setter>
  5. <Setter Property="Foreground" Value="Green"></Setter>
  6. </Style>
  7. <!--Style2-->
  8. <Style x:Key="Style2" TargetType="{x:Type Button}">
  9. <Setter Property="FontWeight" Value="Bold"></Setter>
  10. <Setter Property="Foreground" Value="Red"></Setter>
  11. </Style>
  12. </Window.Resources>
  13.  
  14. <Grid>
  15. <Button Name="Button1" Width="100" Height="40" Style="{StaticResource Style1}">Button</Button>
  16. <Button Name="Button2" Width="150" Height="30" Click="Button2_Click" Margin="79,143,69,28">Change Button1's Style</Button>
  17. </Grid>
  1. private void Button2_Click(object sender, RoutedEventArgs e)
    {
    this.Button1.Style = (Style)FindResource("Style2");
    }

五、触发器

样式(Styles)由三部分构成:设置器(Setter)、触发器(Triggers)、资源(Resources)。触发器,让样式的使用更加准确、灵活和高效。触发器(Triggers)主要分为三类,属性触发器(检查从属属性即WPF元素自身属性)、数据触发器(检查任意可绑定的属性)、事件触发器(用于监听事件)。

属性触发器

  检查从属属性的值,即WPF元素自身属性。比如按钮的内容、字体的大小、颜色等等。

  1. <Window.Resources>
  2. <Style TargetType="Button">
  3. <Style.Triggers>
  4. <Trigger Property="Content" Value="按钮">
    <Setter Property="ToolTip" Value="这是一个按钮">
  5. </Setter>
  6. </Trigger>
  7. </Style.Triggers>
  8. </Style>
  9. </Window.Resources>

<Button Content="按钮" Height="23" HorizontalAlignment="Left" Margin="28,6,0,0" Name="button1" VerticalAlignment="Top" Width="102" />

注意的是: <Trigger Property="Content" Value="按钮">        一定要和<Button Content="按钮"..   content的值一样,否则掉不出来
 

多属性触发器

  1. <Window.Resources>
  2. <Style TargetType="Button">
  3. <Style.Triggers>
  4. <Trigger Property="Content" Value="按钮">
    <Setter Property="ToolTip" Value="这是一个按钮"></Setter>
  5. </Trigger>
  6. <Trigger Property="Content" Value="Button">
    <Setter Property="ToolTip" Value="This is a button"></Setter>
  7. </Trigger>
  8. </Style.Triggers>
  9. </Style>
  10. </Window.Resources>

多条件属性触发器

  1. <Window.Resources>
  2. <Style TargetType="Button">
  3. <Style.Triggers>
  4. <MultiTrigger>
  5. <!--条件列表-->
  6. <MultiTrigger.Conditions>
  7. <Condition Property="Content" Value="按钮"></Condition>
  8.  
  9. <Condition Property="Visibility" Value="Visible"></Condition> </MultiTrigger.Conditions>
  10. <!--样式-->
  11. <Setter Property="ToolTip" Value="这是一个可见按钮"></Setter>
  12. </MultiTrigger>
  13. </Style.Triggers>
  14. </Style>
  15. </Window.Resources>

 数据触发器

  可以检查任意可绑定的属性,比如CLR对象属性、XPath声明等。相对于属性触发器,数据触发器通常用来检查不可见的对象属性。

  1. <Window x:Class="WpfApplication2.样式的用法.styleDemo"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. Title="styleDemo" Height="300" Width="300">
  5. <Window.Resources>
  6. <Style TargetType="Button">
  7. <Style.Triggers>
  8. <DataTrigger Binding="{Binding Path=Name}" Value="dd">
  9. <Setter Property="Foreground" Value="Tomato"/>
  10. </DataTrigger>
  11. </Style.Triggers>
  12. </Style>
  13. </Window.Resources>
  14. <Grid>
  15. <Button Content="{Binding Path=Name}" Height="23" Margin="103,94,120,84" Name="button1" Width="75"/>
  16. </Grid>
  17. </Window>
  1. public partial class styleDemo : Window
  2. {
  3. public styleDemo()
  4. {
  5. InitializeComponent();
  6. DataContext = new Person("dddd", "dd"); }
  7.  
  8. class Person {
  9. string _Name;
  10. public string Name { get { return _Name; }
  11. set { _Name = value; } }
  12. string _Age;
  13. public string Age { get { return _Age; }
  14. set { _Age = value; } }
  15. public Person(string name, string age)
  16. { _Name = name; _Age = age; } }
  17. }

多条件数据触发器

  1. <Window.Resources>
  2. <Style TargetType="Button">
  3. <Style.Triggers>
  4. <MultiDataTrigger>
  5. <!--条件列表-->
  6. <MultiDataTrigger.Conditions>
  7. <Condition Binding="{Binding Path=Name}" Value="李宝亨"/>
  8. <Condition Binding="{Binding Path=Age}" Value="21"/>
  9. </MultiDataTrigger.Conditions>
  10. <Setter Property="Foreground" Value="Tomato"/>
  11. </MultiDataTrigger>
  12. </Style.Triggers>
  13. </Style>
  14. </Window.Resources>
  15. <Grid>
  16. <Button Content="{Binding Path=Name}" Height="23" Margin="103,94,120,84" Name="button1" Width="75"/>
  17. </Grid>

事件触发器

  1. <Window.Resources>
  2. <Style TargetType="Button">
  3. <Style.Triggers>
  4. <!--事件触发器-->
  5. <EventTrigger RoutedEvent="MouseEnter">
  6. <BeginStoryboard>
  7. <Storyboard>
  8. <DoubleAnimation Storyboard.TargetProperty="Opacity" From="1" To="0.1" Duration="0:0:3"></DoubleAnimation>
  9. </Storyboard>
  10. </BeginStoryboard>
  11. </EventTrigger>
  12. </Style.Triggers>
  13. </Style>
  14. </Window.Resources>

后续..

wpf:样式(转)的更多相关文章

  1. Bootstrap WPF Style,Bootstrap风格的WPF样式

    简介 GitHub地址:https://github.com/ptddqr/bootstrap-wpf-style 此样式基于bootstrap-3.3.0,样式文件里的源码行数都是指的这个版本.CS ...

  2. 写自己的WPF样式 - 窗体

    初试WPF样式,感觉还不错.上篇写完了按钮的样式下面写窗体,废话不多说直接上代码: (1)定义一个窗体样式"MyWpfWindow" <Style x:Key="M ...

  3. C#工具:Bootstrap WPF Style,Bootstrap风格的WPF样式

    简介 GitHub地址:https://github.com/ptddqr/bootstrap-wpf-style 此样式基于bootstrap-3.3.0,样式文件里的源码行数都是指的这个版本.CS ...

  4. WPF样式(Style)入门

    原文:WPF样式(Style)入门 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_34802416/article/details/78231 ...

  5. WPF样式——经典博客

    WPF样式博客:http://www.cnblogs.com/luluping/archive/2011/05/06/2039498.html

  6. WPF样式学习三

    SnapsToDevicePixels 获取或设置在呈现过程,该值来确定呈现此元素是否应使用特定于设备的像素设置. 这是一个依赖项属性. true ,如果元素应以符合呈现到设备像素;否则, false ...

  7. WPF样式与触发器(3)

    WPF中的各类控件元素, 都可以自由的设置其样式. 诸如: 字体(FontFamily) 字体大小(FontSize) 背景颜色(Background) 字体颜色(Foreground) 边距(Mar ...

  8. 【转】【WPF】WPF样式(Style)—触发器

    样式(Styles)由三部分构成:设置器(Setter).触发器(Triggers).资源(Resources). (1)触发器,让样式的使用更加准确.灵活和高效. (2)触发器(Triggers)主 ...

  9. WPF 样式和行为

    样式(style):组织和重用格式化选项的重要工具,将细节如边距.字体.字号等信息封装起来,然后再需要的地方通过属性来应用样式. 行为(behavior):封装一些通用的UI行为,如拖动,缩放元素的代 ...

  10. WPF样式资源文件简单运用

    WPF通过资源来保存一些可以被重复利用的样式,下面的示例展示了简单的资源样式文件的使用: 一.xaml中定义资源及简单的引用 <Window.Resources > <!--wpf窗 ...

随机推荐

  1. testNG设置测试的执行顺序

    在java类中,设置Test的执行顺序可以使用priority,或者enabled等属性.但是在testng.xml中,需要设置它的 preserve-order="true" 另 ...

  2. I do not want to inherit the child opacity from the parent in CSS(不想让子元素继承父元素的透明度)

    Instead of using opacity, set a background-color with rgba, where 'a' is the level of transparency. ...

  3. SSIS 部署到SQL Job

    微软 BI 系列随笔 - SSIS 基础 - 部署SQL Job 简介 在之前博客中,讲述了如何实现SSIS的项目部署以及利用SSIS的参数与环境加速部署,参见 微软 BI 系列随笔 - SSIS 基 ...

  4. Zigbee组网原理详解

    Zigbee组网原理详解 来源:互联网 作者:佚名2015年08月13日 15:57   [导读] 组建一个完整的zigbee网状网络包括两个步骤:网络初始化.节点加入网络.其中节点加入网络又包括两个 ...

  5. work flow

  6. [SharpZipLib 未能加载文件或程序集] 解决方法

    未能加载文件或程序集"ICSharpCode.SharpZipLib, Version=0.86.0.518, Culture=neutral, PublicKeyToken=1b03e6a ...

  7. Android BaseAdapter的使用

    数据适配器有很多种,今天在这里记录一下最通用是适配器BaseAdapter. 首先说一下什么是适配器,这里我从网上找到一幅图片 由上图我们不难看出,所谓的适配器,就是数据与视图之间的桥梁.由它把数据绑 ...

  8. 如何定义DATATABLE,同时赋值

    //定义一个Table DataTable dt=new DataTable("yeji"); DataRow dr; DataColumn dc; //添加第0列 dc=new ...

  9. C++学习基础四——顺序容器和关联容器

    —顺序容器:vector,list,queue1.顺序容器的常见用法: #include <vector> #include <list> #include <queue ...

  10. NHibernate系列文章一:NHibernate介绍

    摘要 NHibernate是一个成熟的开源的面向对象的.net映射框架.大量的实际项目中正在使用该框架.他是建立在ADO.Net基础之上.目前的版本是NHibernate 4.0.4.本系列文章都是基 ...