原文: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. Android用surface直接显示yuv数据(二)

    上一篇文章主要是參照AwesomePlayer直接用SoftwareRenderer类来显示yuv,为了能用到这个类,不惜依赖了libstagefright.libstagefright_color_ ...

  2. 解决Java compiler level does not match the version of the installed Java project facet.问题

    其实之前遇到过Java compiler level does not match the version of the installed Java project facet.这个问题,因为当时没 ...

  3. Windows下与Linux下编写socket程序的区别 《转载》

     原文网址:http://blog.chinaunix.net/uid-2270658-id-308160.html [[Windows]] [Windows: 头文件的区别] #include< ...

  4. Thinkphp入门 四 —布局、缓存、系统变量 (48)

    原文:Thinkphp入门 四 -布局.缓存.系统变量 (48) [控制器操作方法参数设置] http://网址/index.php/控制器/操作方法 [页面跳转] [变量调节器] Smarty变量调 ...

  5. 14.8.1 Enabling File Formats

    14.8 InnoDB File-Format Management 14.8.1 Enabling File Formats 14.8.2 Verifying File Format Compati ...

  6. POJ 2186 Popular Cows (强联通)

    id=2186">http://poj.org/problem? id=2186 Popular Cows Time Limit: 2000MS   Memory Limit: 655 ...

  7. 【免费】iPhone上最好用的短信群发软件: 高速短信4.1

    免费的最新的联系人.群组.多人发送短信软件短信群发4.1已经出炉.欢迎下载! *归属地信息让你时时记着好友的地方,让陌生号码变得不陌生:  *您能够选择最经常使用的联系人然后发送高速短信; *群联系人 ...

  8. Windows 编程之 对话框总结

    关于对话框 1 对话框种类 对话框也是一种资源,Windows中对话框分为模态的和非模态的,以及Windows系统中已经定义好的那些通用对话框,比方打开文件,目录,调色板,字符串查找等. 2 模态对话 ...

  9. POJ 3007 Organize Your Train part II

    题意: 如上图所示,将一个字符串进行分割,反转等操作后不同字符串的个数: 例如字符串abba:可以按三种比例分割:1:3:2:2:3:1 部分反转可以得到如下所有的字符串: 去掉重复可以得到六个不同的 ...

  10. 使用Understand获取某个函数(方法)的静态度量指标

    在之前的一篇日志中,我简单总结了调用Understand的Perl API的方法,这里再简单总结一些经验: 在SciTools\doc\manuals\pdf目录下的understand_api.pd ...