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

简介: 原文:WPF界面设计技巧(10)-样式的继承    PS:现在我的MailMail完工了,进入内测阶段了,终于可以腾出手来写写教程了哈,关于MailMail的介绍及内测程序索取:http://www.cnblogs.com/SkyD/archive/2008/08/09/1264083.html  欢迎帮我捉虫,以及与我交流WPF技术   WPF的样式的继承属性极少被文章提及,以至于我在编写MailMail期间为此踌躇数日,最后终于在E文版的MS社区得到指点才得以解惑。
原文: 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 >

 

现在的界面效果:

 

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

 

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

 

 

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

 

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

 

完整代码:

 

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 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疑难问题之Treeview中HierarchicalDataTemplate多级样式
WPF疑难问题之Treeview中HierarchicalDataTemplate多级样式
880 0
WPF-布局样式练习-Day02-聊天气泡
WPF-布局样式练习-Day02-聊天气泡
649 1
|
开发者 C# UED
WPF与多媒体:解锁音频视频播放新姿势——从界面设计到代码实践,全方位教你如何在WPF应用中集成流畅的多媒体功能
【8月更文挑战第31天】本文以随笔形式介绍了如何在WPF应用中集成音频和视频播放功能。通过使用MediaElement控件,开发者能轻松创建多媒体应用程序。文章详细展示了从创建WPF项目到设计UI及实现媒体控制逻辑的过程,并提供了完整的示例代码。此外,还介绍了如何添加进度条等额外功能以增强用户体验。希望本文能为WPF开发者提供实用的技术指导与灵感。
853 0
|
存储 开发者 C#
WPF与邮件发送:教你如何在Windows Presentation Foundation应用中无缝集成电子邮件功能——从界面设计到代码实现,全面解析邮件发送的每一个细节密武器!
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中集成电子邮件发送功能,详细介绍了从创建WPF项目到设计用户界面的全过程,并通过具体示例代码展示了如何使用`System.Net.Mail`命名空间中的`SmtpClient`和`MailMessage`类来实现邮件发送逻辑。文章还强调了安全性和错误处理的重要性,提供了实用的异常捕获代码片段,旨在帮助WPF开发者更好地掌握邮件发送技术,提升应用程序的功能性与用户体验。
430 0
|
开发者 C# 存储
WPF开发者必读:资源字典应用秘籍,轻松实现样式与模板共享,让你的WPF应用更上一层楼!
【8月更文挑战第31天】在WPF开发中,资源字典是一种强大的工具,用于共享样式、模板、图像等资源,提高了应用的可维护性和可扩展性。本文介绍了资源字典的基础知识、创建方法及最佳实践,并通过示例展示了如何在项目中有效利用资源字典,实现资源的重用和动态绑定。
545 0
|
开发者 C# 存储
WPF开发者必读:样式与模板的艺术,轻松定制UI外观,让你的应用程序更上一层楼!
【8月更文挑战第31天】在WPF应用开发中,样式与模板是实现美观界面与一致性的关键工具。样式定义了控件如字体、颜色等属性,而模板则允许自定义控件布局与子控件,两者均可存储于`.xaml`文件中。本文介绍了样式与模板的基础知识,通过示例展示了如何创建并应用它们来改变按钮的外观,从而提升用户体验。
529 0
|
存储 前端开发 C#
WPF/C#:更改界面的样式
WPF/C#:更改界面的样式
286 0
浅谈WPF之样式与资源
WPF通过样式,不仅可以方便的设置控件元素的展示方式,给用户呈现多样化的体验,还简化配置,避免重复设置元素的属性,以达到节约成本,提高工作效率的目的,样式也是资源的一种表现形式。本文以一个简单的小例子,简述如何设置WPF的样式以及资源的应用,仅供学习分享使用,如有不足之处,还请指正。
463 0
WPF-Binding问题-模板样式使用Binding TemplatedParent与TemplateBinding区别
WPF-Binding问题-模板样式使用Binding TemplatedParent与TemplateBinding区别
605 0
WPF-样式问题-处理ListBox、ListView子项内容全填充问题
WPF-样式问题-处理ListBox、ListView子项内容全填充问题
578 0