原文:WPF界面设计技巧(10)-样式的继承

PS:现在我的MailMail完工了,进入内测阶段了,终于可以腾出手来写写教程了哈,关于MailMail的介绍及内测程序索取:http://www.cnblogs.com/SkyD/archive/2008/08/09/1264083.html

欢迎帮我捉虫,以及与我交流WPF技术

WPF的样式的继承属性极少被文章提及,以至于我在编写MailMail期间为此踌躇数日,最后终于在E文版的MS社区得到指点才得以解惑。

现将其分享出来,这是一个非常有用的特性,这是所有教程在讲Style时就该顺带讲出来的,我希望更多人看到,以少走弯路。

WPF的样式需要显示声明继承,即使用Style的BasedOn属性。

我们先在资源中定义一个基样式:

      <Style x:Key="BASE">
         <Setter Property="Control.Margin" Value="6"/>
         <Setter Property="Control.Background">
            <Setter.Value>
               <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                  <GradientStop Offset="1" Color="#FF7A0000"/>
                  <GradientStop Offset="0.5" Color="#FFFF0000"/>
                  <GradientStop Offset="0.5" Color="#FFD40000"/>
                  <GradientStop Offset="0" Color="#FFFFC5C5"/>
               </LinearGradientBrush>
            </Setter.Value>
         </Setter>
      </Style>

注意它设置属性时都是采用“Control.”前缀,因为我们没有为之确定TargetType,如果不使用这个前缀将会报错。

然后我们定义两个继承自它的样式,分别为对应按钮和文本框的样式:

      <Style BasedOn="{StaticResource BASE}" TargetType="Button">
         <Setter Property="Foreground" Value="#FFFFFB92"/>
         <Setter Property="Padding" Value="8,3"/>
      </Style>
      <Style BasedOn="{StaticResource BASE}" TargetType="TextBox">
         <Setter Property="Foreground" Value="#FFFFFFFF"/>
      </Style>

BasedOn属性设为了我们先前设置的“BASE”,各自追加了一些属性的设置。

现在在界面上添加一个按钮和一个文本框控件:

      <DockPanel Width="225" Height="256">
         <Button DockPanel.Dock="Bottom">Button
         </Button>
         <TextBox AcceptsReturn="True" DockPanel.Dock="Top" VerticalScrollBarVisibility="Visible">TextBox Test Test Test Test Test
         </TextBox>
      </DockPanel>

现在界面效果如下:

可以看到,按钮和文本框都继承了基样式中的背景和外边距。

此外,还可以使用BasedOn来继承现有样式。

这里的现有样式不是指WPF自带的主题基础样式,而是控件当前的样式,就是你上面看到的样式,我们下面将继承于当前的按钮样式,再进行一些改变。

在资源中新增:

      <Style x:Key="NewButton" BasedOn="{StaticResource {x:Type Button}}" TargetType="Button">
         <Setter Property="FontWeight" Value="Bold"/>
         <Setter Property="FontSize" Value="22"/>
         <Setter Property="BorderBrush">
            <Setter.Value>
               <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                  <GradientStop Offset="0" Color="#FFFF7300"/>
                  <GradientStop Offset="1" Color="#03FF0000"/>
               </LinearGradientBrush>
            </Setter.Value>
         </Setter>
      </Style>

BasedOn属性设为了按钮类型,在样式中改变了字体的尺寸和粗细以及按钮边框的颜色。

添加一个新按钮,应用这个样式:

         <Button DockPanel.Dock="Bottom" Style="{StaticResource NewButton}">NewButton
         </Button>

现在的界面效果:

继承现有效果有什么意义?

比如我们引用了一个外来的整套界面样式,但在局部界面上需要修改一下,这时如果新设一个样式将会是大费周折的事,直接修改控件自身的属性又会造成冗余和不一致性,继承就是最佳的选择了。

通过继承基样式及充分地重用通用资源(如色彩、笔刷),我们不难实现界面的色彩风格切换功能。

为一套样式定义多种风格供选,或是让用户自由定制他们喜欢的色彩主题,将是一项激动人心的功能。

完整代码:

Code

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
   <Page.Resources>
      <Style x:Key="BASE">
         <Setter Property="Control.Margin" Value="6"/>
         <Setter Property="Control.Background">
            <Setter.Value>
               <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                  <GradientStop Offset="1" Color="#FF7A0000"/>
                  <GradientStop Offset="0.5" Color="#FFFF0000"/>
                  <GradientStop Offset="0.5" Color="#FFD40000"/>
                  <GradientStop Offset="0" Color="#FFFFC5C5"/>
               </LinearGradientBrush>
            </Setter.Value>
         </Setter>
      </Style>
      <Style BasedOn="{StaticResource BASE}" TargetType="Button">
         <Setter Property="Foreground" Value="#FFFFFB92"/>
         <Setter Property="Padding" Value="8,3"/>
      </Style>
      <Style BasedOn="{StaticResource BASE}" TargetType="TextBox">
         <Setter Property="Foreground" Value="#FFFFFFFF"/>
      </Style>
      <Style x:Key="NewButton" BasedOn="{StaticResource {x:Type Button}}" TargetType="Button">
         <Setter Property="FontWeight" Value="Bold"/>
         <Setter Property="FontSize" Value="22"/>
         <Setter Property="BorderBrush">
            <Setter.Value>
               <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                  <GradientStop Offset="0" Color="#FFFF7300"/>
                  <GradientStop Offset="1" Color="#03FF0000"/>
               </LinearGradientBrush>
            </Setter.Value>
         </Setter>
      </Style>
   </Page.Resources>
   <Grid>
      <DockPanel Width="225" Height="256">
         <Button DockPanel.Dock="Bottom">Button
         </Button>
         <Button DockPanel.Dock="Bottom" Style="{StaticResource NewButton}">NewButton
         </Button>
         <TextBox AcceptsReturn="True" DockPanel.Dock="Top" VerticalScrollBarVisibility="Visible">TextBox Test Test Test Test Test
         </TextBox>
      </DockPanel>
   </Grid>
</Page>

尽管有严重的火星嫌疑...

没关系,重在分享,不怕丢龈~:

我还是要顺路推荐一下这款XAML编辑器——Kaxaml:http://www.kaxaml.com/

实在太好用了,比微软那个XamlPad强老了,一定要普及到人手一份才对。

WPF界面设计技巧(10)-样式的继承的更多相关文章

  1. WPF界面设计技巧(4)—自定义列表项样式

    原文:WPF界面设计技巧(4)-自定义列表项样式 有前面修改按钮样式的基础,我们可以尝试来定制一个即好看又好用的 ListBox ,今天先来讲“好看”部分. 打开 Microsoft Visual S ...

  2. WPF界面设计技巧(2)—自定义漂亮的按钮样式

    原文:WPF界面设计技巧(2)-自定义漂亮的按钮样式 上次做了个很酷的不规则窗体,这次我们来弄点好看的按钮出来,此次将采用纯代码来设计按钮样式,不需要 Microsoft Expression Des ...

  3. WPF界面设计技巧(11)-认知流文档 & 小议WPF的野心

    原文:WPF界面设计技巧(11)-认知流文档 & 小议WPF的野心 流文档是WPF中的一种独特的文档承载格式,它的书写和呈现方式都很像HTML,它也几乎具备了HTML的绝大多数优势,并提供了更 ...

  4. WPF界面设计技巧(8)—自制山寨版CheckListBox

    原文:WPF界面设计技巧(8)-自制山寨版CheckListBox 近年来IT市场山寨横行啊,我们今天也来发扬一下山寨精神,搞个自制的CheckListBox出来. 喏,CheckListBox 就是 ...

  5. WPF界面设计技巧(7)—模拟电梯升降的缓动动画

    原文:WPF界面设计技巧(7)-模拟电梯升降的缓动动画 如同Flash一样,WPF的亮点之一也在于其擅于表现平滑的动画效果,但以移动动画来说,仅凭简单的起始位置.目标位置,所产生的动画仍会非常生硬,这 ...

  6. WPF界面设计技巧(6)—玩玩数字墨水手绘涂鸦

    原文:WPF界面设计技巧(6)-玩玩数字墨水手绘涂鸦 想让你的程序支持鼠标及手写笔涂鸦吗?只要敲入“<InkCanvas/>”这几个字符,你就会领悟什么叫“很好很强大”,今天我们来做一个手 ...

  7. WPF界面设计技巧(5)—自定义列表项呈现内容

    原文:WPF界面设计技巧(5)-自定义列表项呈现内容 接续上次的程序,稍微改动一下原有样式,并添加一个数据模板,我们就可以达成下面这样的显示功能: 鼠标悬停于文件列表项上,会在工具提示中显示图像缩略图 ...

  8. WPF界面设计技巧(1)—不规则窗体图文指南

    原文:WPF界面设计技巧(1)-不规则窗体图文指南 初到园子,奉上第一篇入门级教程,请勿见笑. 以往WinForm编程中,实现不规则窗体是有一定难度的,更难的是不规则窗体的边缘抗锯齿及局部透明处理.而 ...

  9. WPF界面设计技巧(9)—使用UI自动化布局

    原文:WPF界面设计技巧(9)-使用UI自动化布局 最近一直没时间更新这系列文章,因为我一直在埋头编写我的第一个WPF应用程序:MailMail 今天开始编写附属的加密/解密工具,对UI自动化布局有些 ...

随机推荐

  1. hadoop学习;hadoop伪分布搭建

    先前已经做了准备工作安装jdk什么的,以下開始ssh免password登陆.这里我们用的是PieTTY工具,当然你也能够直接在linux下直接操作 ssh(secure shell),运行命令 ssh ...

  2. Servlet的学习之Session(4)

    在本篇中,我们来使用Session完成一个用户登录的案例,前提声明:这个案例主要用于学习Session技术,是属于比较简单的类型,以后会采用MVC模式来开发登录,那就会比较复杂. 现在大多数网站都提供 ...

  3. Mac 安装工具包brew

    linux有命令行工具 apt-get ,Mac 下也有类似的brew 也就是HomeBrew 网址:http://brew.sh/index_zh-cn.html 可以看到mac安装的时候只需要执行 ...

  4. js之checkbox的代码全选/全不选,使用id获取元素,而不是name

    每当有多个选项的时候,都会有一种想法是:全选,全不选,如果子选项有被选,父选项也得被选. 注意:这里是根据id来获取元素的,但是不能直接用getElementById,因为那只能返回一个,而不是集合. ...

  5. Oracle SQL语句执行过程

    前言 QQ群讨论的时候有人遇到这样的问题:where子句中无法访问Oracle自定义的字段别名.这篇 博客就是就这一问题做一个探讨,并发散下思维,谈谈SQL语句的执行顺序问题. 问题呈现 直接给出SQ ...

  6. PowerShell 在线教程 4

    PowerShell 在线教程 4   认识Powershell 介绍和安装 自定义控制台 快速编辑模式和标准模式 快捷键 管道和重定向 Powershell交互式 数学运算 执行外部命令 命令集 别 ...

  7. MyBATIS使用CRUD

    MyEclipse不提供自己主动生成,这里提供mybatis文件包和开发文档 http://download.csdn.net/detail/u010026901/7489319 自己建立配置文件, ...

  8. Delphi 数据类型列表 good

    Delphi 数据类型列表 分类 范围 字节 备注 简单类型 序数 整数 Integer -2147483648 .. 2147483647 4 有符号32位 Cardinal 0 .. 429496 ...

  9. ZeroClipboard插件:兼容各浏览器网页复制功能

    常规利用JS编写的网页复制功能只对IE有效,无法做到兼容其它浏览器,代码如下: function copyToClipBoard(){ var clipBoardContent="" ...

  10. Binders 与 Window Tokens(窗体令牌)

    原文地址:http://www.androiddesignpatterns.com/2013/07/binders-window-tokens.html 安卓的一项核心设计思想是希望能提供一个不须要依 ...