- 浏览: 2163420 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1878)
- [网站分类]ASP.NET (141)
- [网站分类]C# (80)
- [随笔分类]NET知识库 (80)
- [随笔分类]摘抄文字[非技术] (3)
- [随笔分类]养生保健 (4)
- [网站分类]读书区 (16)
- [随笔分类]赚钱 (7)
- [网站分类].NET新手区 (233)
- [随笔分类]网站 (75)
- [网站分类]企业信息化其他 (4)
- [网站分类]首页候选区 (34)
- [网站分类]转载区 (12)
- [网站分类]SQL Server (16)
- [网站分类]程序人生 (7)
- [网站分类]WinForm (2)
- [随笔分类]错误集 (12)
- [网站分类]JavaScript (3)
- [随笔分类]小说九鼎记 (69)
- [随笔分类]技术文章 (15)
- [网站分类]求职面试 (3)
- [网站分类]其他技术区 (6)
- [网站分类]非技术区 (10)
- [发布至博客园首页] (5)
- [网站分类]jQuery (6)
- [网站分类].NET精华区 (6)
- [网站分类]Html/Css (10)
- [随笔分类]加速及SEO (10)
- [网站分类]Google开发 (4)
- [随笔分类]旅游备注 (2)
- [网站分类]架构设计 (3)
- [网站分类]Linux (23)
- [随笔分类]重要注册 (3)
- [随笔分类]Linux+PHP (10)
- [网站分类]PHP (11)
- [网站分类]VS2010 (2)
- [网站分类]CLR (1)
- [网站分类]C++ (1)
- [网站分类]ASP.NET MVC (2)
- [网站分类]项目与团队管理 (1)
- [随笔分类]个人总结 (1)
- [随笔分类]问题集 (3)
- [网站分类]代码与软件发布 (1)
- [网站分类]Android开发 (1)
- [网站分类]MySQL (1)
- [网站分类]开源研究 (6)
- ddd (0)
- 好久没写blog了 (0)
- sqlserver (2)
最新评论
-
JamesLiuX:
博主,能组个队么,我是Freelancer新手。
Freelancer.com(原GAF – GetAFreelancer)帐户里的钱如何取出? -
yw10260609:
我认为在混淆前,最好把相关代码备份一下比较好,不然项目完成后, ...
DotFuscator 小记 -
日月葬花魂:
大哥 能 加我个QQ 交流一下嘛 ?51264722 我Q ...
web应用程序和Web网站区别 -
iaimg:
我想问下嵌入delphi写的程序总是出现窗体后面感觉有个主窗体 ...
C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部 -
iaimg:
代码地址下不了啊!
C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部
WPF 样式
.引言
样式(Style),主要是用来让元素或内容呈现一定外观的属性。WPF中的样式的作用,就像Web中的CSS一样,为界面上的元素定制外观,以提供更好的用户界面。在WPF应用程序中,通过控件的属性,我们也可以实现更改控件的外观。但是,这种方式局限性大、不灵活且不利于维护。例如:
<Grid>
<Button Width="80" Height="30" FontSize="16" FontWeight="Bold" Margin="140,32,78,139">Button1</Button>
<Button Width="80" Height="30" FontSize="16" FontWeight="Bold" Margin="38,86,180,84">Button2</Button>
<Button Width="80" Height="30" FontSize="16" FontWeight="Bold" Margin="38,32,180,139">Button3</Button>
</Grid>
上面只有三个按钮,倘若数十个按钮、或者整个应用程序中所有的按钮,我们都这样给它们编写相同的属性,无疑很麻烦且不利维护。如果我们将上述Button的属性归纳起来,写到一段样式中,为按钮指定该样式(甚至用元素类型样式时,都不需要指定按钮样式),所有按钮就具有统一样式和外观了。如果想修改按钮外观,我们只需要改一下样式代码即可,所有按钮外观都会随之变化。
2.怎样使用样式
样式的使用有多种方法,如内联样式(定义在元素内部)、已命名样式(为样式命名,使用时通过名称引用)、元素类型样式(为一种类型的元素,指定一种样式)等等。
3.内联样式
内敛样式,是在元素定义时,在元素内部通过拓展属性Style来定义样式。
复制代码
<Button>
<Button.Style>
<Style>
<Setter Property="Button.FontSize" Value="16"></Setter>
<Setter Property="Button.Width" Value="80"></Setter>
<Setter Property="Button.Height" Value="40"></Setter>
<Setter Property="Button.Content" Value="Button"></Setter>
</Style>
</Button.Style>
</Button>
复制代码
内联样式的缺点在于,如果想为多个元素指定同一种样式,不得不在每个元素内部都编写同一种样式,这样不但耗费人力,并且后期维护性差。就像网页中的内联CSS一样。所以,一般我们将样式放到资源中,在元素定义时,为其指定一个样式(见下文 已命名样式);或者在资源中,为某一类型的元素指定一个样式(见下文 元素类型样式)。
4.已命名样式
将相同的内敛样式归纳起来,放入资源中,构成一个样式,并为它起一个名字。这样,就可以通过名字为元素指定该样式。
按 Ctrl+C 复制代码
按 Ctrl+C 复制代码
指定目标类型(TargetType)
如果给样式指定一种类型,则属性中的名字可以去掉,上述代码可改成:
复制代码
<Window.Resources>
<Style x:Key="Style1" TargetType="{x:Type Button}">
<Setter Property="FontSize" Value="16"></Setter>
<Setter Property="Width" Value="180"></Setter>
<Setter Property="Height" Value="30"></Setter>
</Style>
</Window.Resources>
<Grid>
<Button Style="{StaticResource Style1}" Margin="23,32,95,139">Button1</Button>
</Grid>
复制代码
上述中的TargetType可以改成Control ,因为Button是从Control派生而来的。同时,CheckBox也是派生自Control,所以将Style1指定给CheckBox也是合适的。这样就能使多种元素共用一种样式。
复制代码
<Window.Resources>
<Style x:Key="Style1" TargetType="{x:Type Control }">
<Setter Property="FontSize" Value="16"></Setter>
<Setter Property="Width" Value="180"></Setter>
<Setter Property="Height" Value="30"></Setter>
</Style>
</Window.Resources>
<Grid>
<Button Style="{StaticResource Style1}" Margin="23,32,95,139">Button1</Button>
<CheckBox Style="{StaticResource Style1}" Margin="23,130,95,41">Checkbox1</CheckBox>
</Grid>
复制代码
Button、Check可以使用Style1,而TextBlock则不行,原因是TextBlock不是派生自Control。
重用样式(Reusing Styles)
重用样式指的是,样式可以拥有目标所没有的属性。比如,我们想定义一种样式,其中含有不想被所有元素共享的属性,而只希望这些非共享属性应用到特定的元素上。这时,我们就可以去掉目标类型,重新加上前缀。
复制代码
<Window.Resources>
<Style x:Key="Style1">
<Setter Property="CheckBox.FontSize" Value="16"></Setter>
<Setter Property="Button.Foreground" Value="Red"></Setter>
<Setter Property="CheckBox.IsChecked" Value="True"></Setter>
</Style>
</Window.Resources>
<Grid>
<CheckBox Style="{StaticResource Style1}" Margin="23,32,95,139">Button1</CheckBox>
<TextBlock Style="{StaticResource Style1}">TextBlock1</TextBlock>
</Grid>
复制代码
将Style1同时指定给CheckBox1和TextBlock1,TextBlocak会自动忽略不适用它们自身的样式属性IsChecked。而二者公有的属性(比如Foreground、FontSize),不论加不加前缀,对二者都有效。
重写样式(Overriding Style)
重写样式属性类似于面向对象中的重写,其效果也类似于CSS中的样式覆盖。最终的外观取决于最近的样式或者属性。比如,给一个元素指定了一个样式,其中包含FontSize属性值为14。而在元素定义时,重新给它的属性FontSize设置了一个值18。最终元素文本的FontSize将为18。
复制代码
<Window.Resources>
<Style x:Key="Style1">
<Setter Property="Button.FontSize" Value="14"></Setter>
</Style>
</Window.Resources>
<Grid>
<Button Width="80" Height="30" FontSize="18">Button1</Button>
</Grid>
复制代码
拓展样式(Extending Styles)
可以对现有样式进行拓展,类似于面向对象中的继承或派生,可以在添加新的属性或者重载已存在的属性。
复制代码
<Window.Resources>
<Style x:Key="Style1" TargetType="Button">
<Setter Property="FontSize" Value="16"></Setter>
<Setter Property="Foreground" Value="Red"></Setter>
</Style>
<Style x:Key="Style2" BasedOn="{StaticResource Style1}" TargetType="Button">
<!--添加新属性-->
<Setter Property="FontWeight" Value="Bold"></Setter>
<!--重载-->
<Setter Property="Foreground" Value="Yellow"></Setter>
</Style>
</Window.Resources>
<Grid>
<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>
复制代码
5.元素类型样式
一般来说,我们希望用户界面上的控件拥有统一外观,比如所有按钮大小相同、颜色一致等,这时我们可以定义一种元素的样式,对一个范围内的所有元素都有效,这就是元素类型样式。
同一类型元素共享外观
倘若希望一个顶级窗口内所有的元素,具有相同的样式和外观——可以这样实现:1.在顶级窗口资源中定义一个样式,不标记x:Key,将TargetType设置为一种元素类型。2.定义元素,不用指定Style,窗口中所有该类型的元素,都将使用资源中定义的样式,并具有统一外观。
复制代码
<Window.Resources>
<!--Button 样式-->
<Style TargetType="{x:Type Button}">
<Setter Property="FontWeight" Value="Normal"></Setter>
<Setter Property="Foreground" Value="Green"></Setter>
</Style>
<!--TextBlock 样式-->
<Style TargetType="TextBlock">
<Setter Property="FontSize" Value="16"></Setter>
<Setter Property="Foreground" Value="Red"></Setter>
</Style>
</Window.Resources>
<Grid>
<Button Name="Button1" Width="80" Height="30" Margin="46,41,172,130">Button1</Button>
<Button Name="Button2" Width="80" Height="30" Margin="46,90,172,80">Button2</Button>
<TextBlock Name="TextBlock1" Margin="164,41,38,0" Height="30" VerticalAlignment="Top">TextBlock1</TextBlock>
<TextBlock Name="TextBlock2" Margin="164,90,38,80">TextBlock2</TextBlock>
</Grid>
复制代码
作用范围
以上的共享外观不仅仅局限于顶级窗口,而是根据你定义的样式所在的范围。如果你将样式定义在一个面板资源中,共享外观将仅仅作用该面板。
窗口范围(作用于该窗口)
复制代码
<Window ...>
<Window.Resources>
<!--Button 样式-->
<Style TargetType="{x:Type Button}">
<Setter Property="Foreground" Value="Green"></Setter>
</Style>
</Window.Resources>
</Window>
复制代码
面板范围(作用于该面板)
复制代码
<Grid>
<Grid.Resources>
<!--Button 样式-->
<Style TargetType="{x:Type Button}">
<Setter Property="Foreground" Value="Green"></Setter>
</Style>
</Grid.Resources>
<!---->
</Grid>
复制代码
应用程序范围(作用于该应用程序)
复制代码
<Application ...>
<Application.Resources>
<!--Button 样式-->
<Style TargetType="{x:Type Button}">
<Setter Property="Foreground" Value="Green"></Setter>
</Style>
</Application.Resources>
</Application>
复制代码
6.编程控制样式
通过代码更改按钮Button1的样式:
复制代码
<Window.Resources>
<!--Style1-->
<Style x:Key="Style1" TargetType="{x:Type Button}">
<Setter Property="FontWeight" Value="Normal"></Setter>
<Setter Property="Foreground" Value="Green"></Setter>
</Style>
<!--Style2-->
<Style x:Key="Style2" TargetType="{x:Type Button}">
<Setter Property="FontWeight" Value="Bold"></Setter>
<Setter Property="Foreground" Value="Red"></Setter>
</Style>
</Window.Resources>
<Grid>
<Button Name="Button1" Width="100" Height="40" Style="{StaticResource Style1}">Button</Button>
<Button Name="Button2" Width="150" Height="30" Click="Button2_Click" Margin="79,143,69,28">Change Button1's Style</Button>
</Grid>
复制代码
private void Button2_Click(object sender, RoutedEventArgs e)
{
this.Button1.Style = (Style)FindResource("Style2");
}
7.触发器
样式(Styles)由三部分构成:设置器(Setter)、触发器(Triggers)、资源(Resources)。触发器,让样式的使用更加准确、灵活和高效。触发器(Triggers)主要分为三类,属性触发器(检查从属属性即WPF元素自身属性)、数据触发器(检查任意可绑定的属性)、事件触发器(用于监听事件)。
属性触发器
检查从属属性的值,即WPF元素自身属性。比如按钮的内容、字体的大小、颜色等等。
复制代码
<Window.Resources>
<Style TargetType="Button">
<Style.Triggers>
<Trigger Property="Content" Value="按钮">
<Setter Property="ToolTip" Value="这是一个按钮"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
复制代码
多属性触发器
复制代码
<Window.Resources>
<Style TargetType="Button">
<Style.Triggers>
<Trigger Property="Content" Value="按钮">
<Setter Property="ToolTip" Value="这是一个按钮"></Setter>
</Trigger>
<Trigger Property="Content" Value="Button">
<Setter Property="ToolTip" Value="This is a button"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
复制代码
多条件属性触发器
复制代码
<Window.Resources>
<Style TargetType="Button">
<Style.Triggers>
<MultiTrigger>
<!--条件列表-->
<MultiTrigger.Conditions>
<Condition Property="Content" Value="按钮"></Condition>
<Condition Property="Visibility" Value="Visible"></Condition>
</MultiTrigger.Conditions>
<!--样式-->
<Setter Property="ToolTip" Value="这是一个可见按钮"></Setter>
</MultiTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
复制代码
数据触发器
可以检查任意可绑定的属性,比如CLR对象属性、XPath声明等。相对于属性触发器,数据触发器通常用来检查不可见的对象属性。
复制代码
<Window.Resources>
<Style TargetType="Button">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Name}" Value="李宝亨">
<Setter Property="Foreground" Value="Tomato"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<Button Content="{Binding Path=Name}" Height="23" Margin="103,94,120,84" Name="button1" Width="75"/>
</Grid>
复制代码
定义的Person类
复制代码
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new Person("李宝亨","21");
}
class Person
{
string _Name;
public string Name
{
get { return _Name; }
set { _Name = value; }
}
string _Age;
public string Age
{
get { return _Age; }
set { _Age = value; }
}
public Person(string name,string age)
{
_Name = name;
_Age = age;
}
}
}
复制代码
多条件数据触发器
复制代码
<Window.Resources>
<Style TargetType="Button">
<Style.Triggers>
<MultiDataTrigger>
<!--条件列表-->
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=Name}" Value="李宝亨"/>
<Condition Binding="{Binding Path=Age}" Value="21"/>
</MultiDataTrigger.Conditions>
<Setter Property="Foreground" Value="Tomato"/>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<Button Content="{Binding Path=Name}" Height="23" Margin="103,94,120,84" Name="button1" Width="75"/>
</Grid>
复制代码
事件触发器
事件触发器用来监听事件。当一个事件发生时,事件触发器就会引发相关的动画事件来进行响应。
复制代码
<Window.Resources>
<Style TargetType="Button">
<Style.Triggers>
<!--事件触发器-->
<EventTrigger RoutedEvent="MouseEnter">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Opacity" From="1" To="0.1" Duration="0:0:3"></DoubleAnimation>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
复制代码
以上代码监听MouseEnter事件,当鼠标经过按钮时,按钮的透明度在3秒内从1降到0.1
相关推荐
这个名为“WPF样式大全”的资源集合提供了超过20种不同设计风格的样式,旨在帮助开发者们提升应用程序的视觉吸引力和用户体验。下面将详细介绍这些关键元素以及它们在WPF中的应用。 1. **样式(Styles)**:在WPF中,...
在Windows Presentation Foundation (WPF) ...总结,WPF样式静态资源绑定是构建高效、美观且易于维护的用户界面的关键技术。通过合理利用静态资源,开发者可以创建出一致的视觉体验,同时减少重复代码,提升开发效率。
**WPF样式与WpfToolkit库详解** WPF(Windows Presentation Foundation)是.NET框架的一部分,用于构建具有丰富用户界面的应用程序。WPF提供了一种强大的样式和模板机制,允许开发者通过定义样式来控制UI元素的外观...
在这个名为"WPF样式.rar"的压缩包中,我们聚焦于两个主要知识点:WPF中的TreeView虚线连接样式以及TreeView的数据过滤功能。 1. **WPF TreeView虚线连接样式** 在WPF中,TreeView控件通常用来展示层次结构的数据,...
**WPF样式集详解** Windows Presentation Foundation(WPF)是微软.NET Framework的一部分,它提供了一个丰富的用户界面(UI)框架,用于构建桌面应用程序。在WPF中,样式和模板是两个核心概念,它们用于控制控件的...
下面,我们将深入探讨WPF样式及其与WpfToolkit的关系。 WPF(Windows Presentation Foundation)是.NET Framework的一部分,用于构建具有丰富图形、媒体和数据绑定能力的桌面应用程序。样式在WPF中扮演着核心角色,...
WPF样式触发器,适合新手学习.........样式 button 触发器 新手学习代码 简单易理解
WPF 的样式与模板 WPF(Windows Presentation Foundation)中的样式和模板是对控件外观和行为的统一定义,通过样式和模板,可以实现控件的统一风格和行为。 在 WPF 中,样式(Style)是一种资源,它可以为控件定义...
1. **WPF样式(Styles)**:WPF样式是一种定义控件外观的方法,它允许在整个应用程序中统一控件的外观。样式通常包含设置颜色、字体、边框等属性的规则。在提供的示例中,你可以找到针对不同控件的预定义样式,如...
### WPF样式与模板 #### 一、WPF样式 WPF(Windows Presentation Foundation)是一种用于构建Windows桌面应用程序的技术框架,它提供了丰富的图形渲染引擎和强大的编程模型。在WPF中,样式(Styles)是非常重要的...
在本文中,我们将深入探讨WPF(Windows Presentation Foundation)中的样式设计,这与提供的压缩包文件"**WPF样式.7z**"紧密相关。该压缩包可能包含一系列示例和资源,帮助开发者理解并应用WPF风格到他们的应用程序...
在Windows Presentation Foundation (WPF) 中,样式图片按钮是一种结合了图像和按钮功能的控件,它可以提供更直观、更具视觉吸引力的用户交互体验。在本文中,我们将深入探讨如何在WPF中创建和使用样式图片按钮,...
WPF的资源管理系统使得全局的样式、颜色和图像可以集中管理,方便在整个应用中统一风格。对于多语言支持,WPF也提供了便捷的机制,使软件能轻松实现国际化和本地化。 总的来说,这个"Wpf框架模块"为工业软件开发者...
WPF 样式查看器,查看控件样式和模板 WPF 样式查看器,查看控件样式和模板
在本文中,我们将深入探讨WPF(Windows Presentation Foundation)中的样式和模板,这些内容在“WPF样式演示”中得到体现。WPF是.NET Framework的一部分,它为开发人员提供了丰富的用户界面(UI)功能,包括强大的...
wpf样式关于wpf央视的资源文件
在本文中,我们将深入探讨WPF(Windows Presentation Foundation)中的"漂亮样式",这是一种利用C#和WPF技术实现用户界面美观化的方法。WPF是.NET Framework的一部分,它提供了丰富的功能来创建桌面应用程序,其中...
在Windows Presentation Foundation(WPF)中,窗体样式重写是一项关键技能,它允许开发者根据自己的设计需求定制用户界面,创造出美观、独特的交互体验。本文将深入探讨如何通过重写WPF窗体样式来实现界面的美化。 ...
首先,WPF的资源样式通常定义在一个或多个`.xaml`文件中,这些文件可以视为样式库,包含各种控件的外观定义。要将这些资源引入到WinForm项目中,我们需要进行以下步骤: 1. **创建WPF资源文件**:在WPF项目(如`...