WPF专业编制程序指南,还没到家

Wtf(一时半刻命名,随便起的 =
_=),模仿WPF的框架,还尚无两全,唯有差不离的底蕴成分,协助数据绑定。纵然支持mono但是mono有bug

先创设一套样式描述细节,然后仅靠设置Style属性应用样式。

      
后面简而言之到了wpf中三种体裁的用法,wpf有着相仿web中的CSS一样,为界面上的要素定制外观,以提供更好的用户界面,那种灵活性也是winForm所不可能及的,此前边讲到的能够领略在WPF应用程序中,通过控件的属性,大家也足以兑现转移控件的外观。然而,那种方法局限性大、不灵活且不便利保养,比如三个,一个按钮的样式能够这么,即便有二十,27个,甚至越来越多,难道也那样啊,分明那不是很好的抉择,倘使大家将上述控件的品质总结起来,写到一段样式中,为按钮内定该样式(甚至用成分类型样式时,都不必要钦赐按钮样式),全部按钮就具备合并样式和外观了。若是想修改按钮外观,大家只要求改一下体裁代码即可,全数按钮外观都会随着变动。

WPF专业编制程序指南 澳门葡京备用网址 1

写这一个只是兴趣爱好,感觉也没多马虎义了,假设这些UI框架完善了,有几人愿意用?终究Windows上有WPF,而且C#跨平台须求也不多啊。我对WPF也不算纯熟,要通盘的话,还有众多要写。一大堆常用控件和设计器。可是笔者绝不XML来叙述,而是径直用C#来定义,设计器直接生成C#代码,因为自身以为,倘若有强有力的设计器,写XML就是剩下的,而且解析XML还影响属性,对于WPF,小编觉着Xaml太啰嗦了。

行事封装一些大旨的UI成效,然后用一两行标记附加到成分上,完结效益。

体制的使用有八种主意,如内联样式(定义在要素内部)、已命名样式(为样式命名,使用时通过名称引用)、成分类型样式(为一种档次的因素,钦点一种体裁)等等。

定价 : ¥68.00

 

体制基础

体制是一种重庆大学的能源。

体制是属性值的聚合,能被使用到二个因素。就好像CSS,WPF样式允许你定义格式化天性并且遍及应用程序地应用它们去保障一致性。就好像CSS,WPF样式能够级联通过成分树自动地采纳到钦命的因素类型的目的。而且,WPF样式更强力,因为她们得以设置任何借助属性。那表示你可以动用它们标准化格式化以外的特色,诸如控制控件的作为性质。WPF样式也协理触发器,那允许你当另1个性格被更改时改变控件的样式,并且他们能够利用模板去重定义控件的内建国门外观。

属性值继承,是依靠属性的表征之一。当你在窗口水平设置属性时,窗口内部装有的因素将取得同样的值,除非显式地掩盖他们。

考虑上面代码:

<Window.Resources>
  <Style x:Key="BigFontButtonStyle">
    <Setter Property="Control.FontFamily" Value="Times New Roman" />
    <Setter Property="Control.FontSize" Value="18" />
    <Setter Property="Control.FontWeight" Value="Bold" />
  </Style>    
</Window.Resources>

那段标记成立单个能源:2个System.Windows.Style对象。样式对象具备3个设置器集合,带有三设置器对象,每一种设置器设置几本性质。每一种设置器对象提议要设置属性的名字。和该属性的值。仿佛全数的财富,样式对象有贰个用于检索能源的重庆大学字。在本例中,关键字是BigFontButtonStyle。(遵照预定,样式关键字的末尾是Style。)

各类WPF成分只可以接纳一个体制(或能够不利用样式)。二个因素通过Style属性应用样式。例如,为布局3个按钮使用你在此之前创建的样式,按钮像这么应用样式财富:

<Button Padding="5" Margin="5" Name="cmd"
 Style="{StaticResource BigFontButtonStyle}"> 
  A Customized Button
</Button>

当然,能够运用代码钦命样式。方法是用FindResource()方法:

cmd.Style = (Style)cmd.FindResource("BigFontButtonStyle");

Style类一共有6个相当重要的性子:

属性 描述
Setters Setter或EventSetter对象的集合。用于自动地设置属性值和附着事件处理器。
Triggers TriggerBase对象的集合,并且允许你自动地改变样式设置。例如,当另一个属性改变时或当一个事件发生时,你能修改一个样式。
Resources 你希望用于样式的资源集合。例如,有时需要用一个对象设置多个属性。在那种情况下,更有效的是创造对象作为一个资源,然后在你的设置器对象中使用那资源,而不是在每个设置器中,使用嵌套标签创造对象。
BasedOn 一个属性,允许你创造一个更特殊的样式。此样式继承(和可选地覆盖)另一个样式的设置。
TargetType 一个属性,识别样式所作用于的元素类型。此属性允许你创造仅影响某些元素的设置器,它允许你创造对于匹配的元素类型自动生效的设置器。

① 、内联样式

会员价

¥51.00(75折)

WtfObject 
也正是WPF里的DependencyObject依赖对象。继承该类的指标,全体属性私下认可都是注重属性

创设三个样式对象

您能成立各个程度的财富汇集,窗口的,容器的,或然应用程序的。

实质上,你可以平昔设置控件的体制:

<Button>
  <Button.Style>
    <Style>
      <Setter Property="Control.FontFamily" Value="Times New Roman" />
      <Setter Property="Control.FontSize" Value="18" />
      <Setter Property="Control.FontWeight" Value="Bold" />
    </Style>
  </Button.Style>
  <Button.Content>A Customized Button</Button.Content>
</Button>

诸如下边包车型大巴为text博克斯加样式

高校减价价 :¥51(75折)
本书样章免费试读:

本性写法:

设置属性

如您所见,每个Style对象包裹叁个Setter对象的集纳。各种Setter对象设置八个因素的叁性子质。唯一限制是叁个设置器只可以变更3个重视属性—不可能改改其余质量。

在局地动静下,你不能够应用1个简短的字符串设置属性值。例如,无法利用一个简易字符串创建二个ImageBrush对象。在那种情景下,你能用3个嵌套成分设置属性。那是四个例证:

<Style x:Key="HappyTiledElementStyle">
  <Setter Property="Control.Background">
    <Setter.Value>
      <ImageBrush TileMode="Tile"
        ViewportUnits="Absolute" Viewport="0 0 32 32"
        ImageSource="happyface.jpg" Opacity="0.3">
      </ImageBrush>
    </Setter.Value>
  </Setter>
</Style>

 

为识别你指望设置的性质,你供给提供八个类和两性情能的名字。不过,类名字不需倘若概念属性的类。它也能是此类的1个派生类。例如,考虑上边BigFontButton样式的版本,Button类的引用代替Control类的引用:

<Style x:Key="BigFontButtonStyle">
  <Setter Property="Button.FontFamily" Value="Times New Roman" />
  <Setter Property="Button.FontSize" Value="18" />
  <Setter Property="Button.FontWeight" Value="Bold" />
</Style>

有别于是派生类收缩了体制应用的限制。例如,这么些样式能够影响Button控件,但是无法影响Label控件。对于利用Control类的前面包车型地铁事例,这一个样式即能够影响Button控件,也得以影响Label控件。

WPF忽略非常小概被运用的习性。

如若体制中的全体属性都应用到同品种的成分,能够安装TargetType属性,提议属性应用的类:

<Style x:Key="BigFontButtonStyle" TargetType="Button">
  <Setter Property="FontFamily" Value="Times New Roman" />
  <Setter Property="FontSize" Value="18" />
  <Setter Property="FontWeight" Value="Bold" />
</Style>

能够瞥见,全数设置器的Property属性内并未指明类名。

<TextBox Text="内容">
            <TextBox.Style>
                <Style>
                    <Setter Property="TextBox.FontSize" Value="16"></Setter>
                    <Setter Property="TextBox.Width" Value="80"></Setter>
                    <Setter Property="TextBox.Height" Value="40"></Setter>

                </Style>
            </TextBox.Style>
        </TextBox>

作者: 李应保    [作译者介绍]
出版社:电子工业出版社
ISBN:9787121100116
上架时间:二零零六-1-8
出版日期:二零零六 年1八月
开本:16开
页码:525
版次:1-1

 

叠加事件处理器

<Style x:Key="MouseOverHighlightStyle">
  <EventSetter Event="TextBlock.MouseEnter" Handler="element_MouseEnter" />
  <EventSetter Event="TextBlock.MouseLeave" Handler="element_MouseLeave" />
  <Setter Property="TextBlock.Padding" Value="5"/>
</Style>

体制能够一直嵌套Setter成分和伊芙ntSetter成分。

那是事件处理的代码:

private void element_MouseEnter(object sender, MouseEventArgs e)
{
    ((TextBlock)sender).Background =
      new SolidColorBrush(Colors.LightGoldenrodYellow);
}

private void element_MouseLeave(object sender, MouseEventArgs e)
{
    ((TextBlock)sender).Background = null;
}

鼠标进入和鼠标离开都以直接事件路由。

应用样式:

<TextBlock Style="{StaticResource MouseOverHighlightStyle}">
 Hover over me.
</TextBlock>

本条功用也可以用事件触发器完成。

对于冒泡事件,最棒直接在容器元素中连连事件处理函数。

就是,大家能够通过在要素内部通过开始展览属性Style来定义样式。不过缺点也是显著的,假使有几个这么的控件指向同二个体制,该怎么办吧,只好各类都要写,所以很不好,所以我们得以在财富中定义2个样式,然后让三个控件调用那二个体制即可

【编辑推荐】
一应俱全系统,深入应用
通俗易懂,实例丰盛

        /// <summary>
        /// 绑定的数据上下文
        /// </summary>
        [UIPropertyMetadata(null, true)]
        public virtual object DataContext
        {
            get { return GetValue<object>(); }
            set { SetValue(value); }
        }

多层样式

运用属性值继承特征的本性包括IsEnabled,IsVisible,Foreground,以及具有字体属性。

依照在此以前的样式建立二个新样式,使用BasedOn属性:

<Window.Resources>
  <Style x:Key="BigFontButtonStyle">
    <Setter Property="Control.FontFamily" Value="Times New Roman" />
    <Setter Property="Control.FontSize" Value="18" />
    <Setter Property="Control.FontWeight" Value="Bold" />
  </Style>

  <Style x:Key="EmphasizedBigFontButtonStyle"
    BasedOn="{StaticResource BigFontButtonStyle}">
    <Setter Property="Control.Foreground" Value="White" />
    <Setter Property="Control.Background" Value="DarkBlue" />
  </Style>
</Window.Resources>

 

唯有八个样式有语义上的调换,不然不要选拔BasedOn属性使他们相关联。

贰 、已命名样式

【内容简介】
《WPF专业编制程序指南》是一本WPF编制程序的行业内部部参考音讯考书,全书通过大量的实例深切演讲了WPF中的传递事件、传递命令、相关属性、附加属性、逻辑树和视觉树等基本概念;介绍了种种画笔、画刷的应用方法;
深远讨论了WPF中的各样控件以及这一个控件在窗口或页面上的排版,并随之解说了控件的作风和模板及数量绑定等相关技术。
本书对WPF中的图形系统及图片和排版的更换原理也拓展了尖锐的探赜索隐,并在此基础上切磋了WPF中的动画技术。多媒体不是WPF专有的技艺,但本书介绍了在WPF中使用多媒体的实用技术。用户控件和自定义控件是WPF中相比尖锐的情节,本书最终两章对这一课题展开了深层次的探究,通过对Ribbon控件的开发,不仅能够精通开发用户控件和自定义控件的法子,而且能够回味WPF项指标团伙及多样WPF技术细节的综合运用。
本书可供.NET
桌面及网络应用程序的开发职员、项目管理职员或准备进入这一天地的相关工程技术人士,以及大学本科或专科高校与高校相关专业的师生参考学习。

 

活动应用样式到花色

体制财富可以自行应用到钦命项指标因素。只必要设置TargetType属性钦点指标项目,并且完全省略关键字。那时,实际上隐式使用了档次标记扩大:

x:Key="{x:Type Button}"

那是机动应用按钮样式的例证:

<Window.Resources>
  <Style TargetType="Button">
    <Setter Property="FontFamily" Value="Times New Roman" />
    <Setter Property="FontSize" Value="18" />
    <Setter Property="FontWeight" Value="Bold" />
  </Style>
</Window.Resources>

<StackPanel Margin="5">
  <Button Padding="5" Margin="5">Customized Button</Button>
  <TextBlock Margin="5">Normal Content.</TextBlock>
  <Button Padding="5" Margin="5" Style="{x:Null}">A Normal Button</Button>
  <TextBlock Margin="5">More normal Content.</TextBlock>
  <Button Padding="5" Margin="5">Another Customized Button</Button>
</StackPanel>

高级中学档的按钮显式删除了体制。不用提供新样式,只要求设置Style属性为空。

 将同一的内敛样式归咎起来,放入能源中,构成四个样式,并为它起贰个名字。那样,就足以因此名字为成分钦定该样式。

目录

率先篇 WPF编制程序基础
第壹章 WPF应用程序 2
1.1 WPF应用程序的创造 2
1.2 Dos窗口 3
1.3 WPF应用程序的启航和终止 4
1.4 输入参数 5
1.5 在Xaml中创建Application 7
1.6 窗口大小 10
1.7 互连网应用程序 10
1.8 应用程序的相当处理 11
1.9 应用程序中的财富 12
1.10 应用程序的昭示 13
1.11 WPF开发环境 14
1.12 本章小结 15
第2章 XAML语言 16
2.1 XAML是一种界面描述语言 16
2.2 XAML的根元素 17
2.3 XAML命名空间(NameSpace) 17
2.4 XAML和代码分离技术(code behind) 18
2.5 子元素 19

.2.6 相关属性(Dependency Property) 20
2.7 附加属性(Attached Property) 21
2.8 XAML符号扩张 21
2.8.1 静态能源增加(StaticResourceExtension) 22
2.8.2 动态能源扩大(DynamicResourceExtension) 23
2.8.3 数据绑定扩张(Binding) 24
2.8.4 相对数据源扩充(RelativeSource) 24
2.8.5 模板绑定(TemplateBinding) 25
2.8.6 x:Type扩展 26
2.8.7 x:Static扩展 26
2.8.8 x:null扩展 26
2.8.9 x:Array扩展 26
2.9 本章小结 27
第3章 WPF排版 28
3.1 排版基础 28
3.2 堆积面板(StackPanel) 29
3.3 WrapPanel 34
3.4 停靠面板(DockPanel) 35
3.5 表格式面板(Grid) 39
3.5.1 设定UI成分在Grid中的地方 40
3.5.2 设定Grid行或列的尺寸 40
3.5.3 成分横跨八个系列时的设定 41
3.5.4 在Grid中保持多行或多列大小的一致性 44
3.6 UniformGrid 46
3.7 画布面板(Canvas) 47
3.8 本章小结 48
第6章 WPF中的属性系统 49
4.1 CLR属性 49
4.2 相关属性的概念 50
4.2.1 相关属性的传递 50
4.2.2 WPF对有关属性的支撑 51
4.3 自定义相关属性 52
4.4 附加属性 58
4.5 本章小结 67
第6章 画笔和画刷 68
5.1 WPF中的颜色 68
5.2 画刷 75
5.2.1 实心画刷(SolidColorBrush) 76
5.2.2 梯度画刷(GradientBrush) 77
5.2.3 线性梯度画刷(LinearGradientBrush) 77
5.2.4 圆形梯度画刷(RadialGradientBrush) 80
5.2.5 自制画刷(DrawingBrush) 81
5.2.6 粘贴方式(TileMode) 82
5.2.7 伸展方式(Stretch) 83
5.2.8 图像画刷(ImageBrush) 83
5.2.9 控件画刷(VisualBrush) 85
5.3 画笔 88
5.4 本章小结 95

其次篇 WPF专业程序员必备
第6章 WPF控制 98
6.1 WPF控件概述 98
6.2 内容控件(Content Control) 100
6.2.1 框架控件(Frame) 100
6.2.2 WPF按钮(Button) 101
6.2.3 拨动按钮(ToggleButton) 104
6.2.4 CheckBox控件 104
6.2.5 RadioButton控件 104
WPF专业编制程序指南,还没到家。6.2.6 重复按钮(RepeatButton) 105
6.2.7 带有标题栏的始末控件(HeaderedContentControl) 106
6.2.8 分组框(GroupBox) 107
6.2.9 伸展控件(Expander) 109
6.2.10 标签控件(Label) 110
6.2.11 为按钮设置热键 111
6.2.12 ToolTip 113
6.2.13 ScrollViewer 115
6.3 条目控件(Items Controls) 116
6.3.1 菜单(Menu) 117
6.3.2 工具条(ToolBar) 123
6.3.3 Selector 126
6.3.4 组合框(ComboBox) 126
6.3.5 TabControl 129
6.3.6 列表框(ListBox) 132
6.3.7 ListView 135
6.3.8 状态条(StatusBar) 138
6.3.9 树形控件TreeView和TreeViewItem 140
6.4 文本控件(Text Controls) 143
6.4.1 口令输入框(Password博克斯) 143
6.4.2 文字输入框(TextBox) 144
6.4.3 RichTextBox 145
6.5 范围控件(Range Controls) 146
6.5.1 滚动条(ScrollBar) 146
6.5.2 滑动条(Slider) 147
6.5.3 进展条(ProgressBar) 152
6.6 本章小结 152
第七章 传递事件和传递命令系统 153
7.1 WPF中的成分树 153
7.2 传递事件(Routed 伊夫nt) 165
7.2.1 RoutedEventArgs 166
7.2.2 终止事件传播 166
7.2.3 处理传递事件 167
7.2.4 附加传递事件(Attached Routed 伊夫nt ) 168
7.3 考察传递事件 168
7.3.1 键盘事件的发出和传递 174
7.4 自定义传递事件 174
澳门葡京备用网址 ,7.5 管理键盘和鼠标输入事件 182
7.5.1 键盘输入 182
7.5.2 鼠标输入 182
7.6 传递命令 184
7.6.1 ICommand接口 186
7.6.2 ICommandSource接口 186
7.6.3 CommandTarget 186
7.6.4 命令绑定(CommandBinding) 186
7.6.5 传递命令(Routed Command) 187
7.6.6 WPF命令仓库(Command Repository) 187
7.7 本章小结 190
第8章 资源 191
8.1 财富定义及其类型 191
8.2 统一能源标识(Unified Resource Identifier) 192
8.3 .NET开发平台对财富国际化的协理 196
8.3.1 WinForm下的能源管理 197
8.3.2 用XAML成立本地能源 200
8.4 WPF成分中定义的能源 202
8.4.1 静态财富(StaticResource) 203
8.4.2 能源的机能范围 204
8.4.3 静态扩展标识(Static markup extension) 205
8.4.4 动态资源扩张标识(DynamicResource 马克up Extension) 208
8.5 本章小结 210
第9章 风格 211
9.1 Style类 211
9.2 Setters 211
9.3 TargetType 215
9.4 BasedOn 218
9.5 触发器(Triggers) 220
9.5.1 使用单一条件的触发器 221
9.5.2 使用多少个原则的触发器 222
9.5.3 使用数据触发器(DataTrigger) 223
9.6 风格中的财富 225
9.7 IsSealed 227
9.8 把作风定格定义在独立的文本中 227
9.9 在FrameworkContentElement中运用风格 228
9.10 再谈Setter属性 229
9.11 本章小结 230
第10章 模板 231
10.1 模板概述 231
10.2 控件模板 232
10.2.1 在控件中采纳模板 232
10.2.2 在能源中动用模板 234
10.2.3 在控件模板中使用TargetType 235
10.2.4 在模板中浮现控件的始末 236
10.2.5 在模板中央银行使ContentPresenter 237
10.2.6 模板七月素名Name属性 239
10.2.7 在模板中绑定控件的别样属性 239
10.2.8 使用模板呈现电力系统的断路器和刀闸开关 240
10.2.9 在风格中动用模板 242
10.2.10 获取WPF控件的沙盘 243
10.3 数据模板(DataTemplate) 244
10.3.1 大家所面临的题材 244
10.3.2 定义数据模板 247
10.3.3 在财富中使用数据模板 248
10.3.4 数据模板触发器 249
10.3.5 依照数据属性采用相应的模版 250
10.3.6 在数额模板中使用类型转换技术 253
10.4 ItemsPanelTemplate 258
10.5 层次结构数据模板(HierarchicalDataTemplate) 259
10.6 本章小结 262
第二1章 数据绑定(Data Binding) 263
11.1 数据绑定概述 263
11.2 最简便易行的多寡绑定——从界面成分到界面成分 264
11.2.1 一对一多少绑定 264
11.2.2 在C#中,完成数量绑定 265
11.2.3 对不是FrameworkElement和FrameworkContentElement元素达成数据绑定
266
11.3 使用分歧的绑定格局 266
11.4 动态绑定 267
11.5 最简便的多寡绑定——从.NET对象到界面元素 268
11.6 DataContext 271
11.7 控制绑定时刻 272
11.8 开发本人的IValueConverter 273
11.9 在数据绑定中出席校验 275
11.9.1 开发工作规则类 276
11.9.2 在绑定中拉长任意四个事情规则 279
11.9.3 在控件上出示校验新闻 279
11.9.4 触发错误处管事人件 280
11.9.5 清除控件上的错误音信 282
11.10 对聚集对象的绑定 283
11.10.1 使用DisplayMemberPath属性 286
11.10.2 展现当前条目 286
11.10.3 遍历集合中的记录 288
11.10.4 扩展或删除记录 290
11.10.5 对聚集对象分组 293
11.10.6 对聚集对象排序 294
11.10.7 对聚集对象过滤 295
11.11 数据源 296
11.11.1 XML数据源 296
11.11.2 .NET对象数据源 301
11.12 层次结构数据的绑定 303
11.13 本章小结 303
第叁2章 窗口对话框和打字与印刷 304
12.1 窗口(Window) 304
12.1.1 窗口的意况变化和事件 304
12.1.2 明确视窗的岗位 309
12.1.3 鲜明视窗的分寸 310
12.1.4 视窗状态属性(WindowState) 310
12.1.5 视窗大小情势(ResizeMode) 310
12.1.6 视窗风格(WindowStyle) 311
12.2 网页(Page) 311
12.2.1 创制网页 312
12.2.2 KeepAlive属性 312
12.2.3 NavigationService属性 312
12.2.4 ShowsNavigationUI属性 313
12.3 浏览窗口(NavigationWindow) 313
12.3.1 使用统一风格 314
12.3.2 设置NavigationWindow的标题 314
12.3.3 浏览网页 315
12.3.4 使用HyperLink类 315
12.3.5 使用NavigationService转到分歧的网页 318
12.3.6 使用浏览日志转换来区别的网页 319
12.3.7 浏览窗口的浏览事件 319
12.4 对话框(DialogBox) 320
12.4.1 消息框(MessageBox) 320
12.4.2 通用对话框 320
12.4.3 自定义对话框 322
12.5 打字与印刷输出 323
12.5.1 XPS 文书档案简介 323
12.5.2 创建XPS文档 324
12.5.3 显示XPS文档 328
12.5.4 打印 333
12.6 本章小结 333

其三篇 图形和卡通
第③3章 二维图形 336
13.1 WPF图形系统概述 336
13.1.1 统一编制程序模型 336
13.1.2 坐标连串 338
13.1.3 Shape 和Geometry 338
13.2 Shape及其派生类 339
13.2.1 直线(Line) 340
13.2.2 矩形(Rectangle) 340
13.2.3 椭圆(Ellipse) 341
13.2.4 折线(Polyline) 341
13.2.5 多边形(Polygon) 342
13.2.6 填充规则(FillRule) 342
13.2.7 路径(Path) 343
13.3 Geometry及其派生类 343
13.3.1 直线(LineGeometry) 344
13.3.2 矩形(RectangleGeometry) 344
13.3.3 椭圆(EllipseGeometry) 344
13.3.4 几何图形组(GeometryGroup) 345
13.3.5 合并图形(CombinedGeometry) 346
13.3.6 几何途径(PathGeometry) 348
13.3.7 分段路径(PathSegment) 350
13.3.8 弧线(ArcSegment) 350
13.3.9 直线段(LineSegment) 352
13.3.10 折线段(PolyLineSegment) 353
13.3.11 柏之线(BezierSegment) 353
13.3.12 多段柏之线(PolyBezierSegment) 354
13.3.13 一次柏之线(QuadraticBezierSegment) 354
13.3.14 多段1次柏之线(PolyQuadraticBezierSegment) 355
13.3.15 迷你绘图语言 356
13.3.16 流几何图形(StreamGeometry) 360
13.4 绘制(Drawing) 361
13.4.1 使用DrawingImage展现几何图形 362
13.4.2 使用DrawingVisual来展现几何绘制 363
13.4.3 创建DrawingVisual宿主 363
13.4.4 绘制几何图形 364
13.4.5 把DrawingVisual对象加到FrameworkElement中的视觉树和逻辑树中 364
13.4.6 选择视觉成分(Visual Hit Testing) 366
13.4.7 简单选取判断 366
13.4.8 多少个视觉成分的采取判断 367
13.4.9 视觉成分重叠时的接纳判断 367
13.5 本章小结 368
第壹4章 图形转换 369
14.1 图形转换概述 369
14.2 项目管理器 370
14.3 旋转转换(RotateTransform) 376
14.4 位移转换(TranslateTransform) 378
14.5 缩放转换(ScaleTransform) 380
14.6 扭曲转换(SkewTransform) 382
14.7 组合转换(TransformGroup) 384
14.8 矩阵转换(MatrixTransform) 385
14.8.1 矢量操作 385
14.8.2 H坐标系 386
14.8.3 位移转换矩阵 387
14.8.4 旋转转换矩阵 388
14.8.5 缩放转换矩阵 388
14.8.6 扭曲转换矩阵 389
14.8.7 矩阵操作 389
14.9 本章小结 394
第15章 动画 395
15.1 WPF中的动画 395
15.2 动画类继承树 396
15.3 二个简便的动画 397
15.4 控制动画 398
15.4.1 动画所用的年月(duration) 399
15.4.2 设定动画初叶时间Begin提姆e 399
15.4.3 设定自动再次回到(AutoReverse) 399
15.4.4 设定动画速度(SpeedRatio) 400
15.4.5 加速和缓手动画(AccelarationRatio和DecelarationRatio) 400
15.4.6 设定动画的再一次性格(RepeatBehavior) 402
15.4.7 设定动画的停下情状(FillBehavior) 402
15.4.8 设定相关属性的动画范围(From和To) 402
15.4.9 设定相关属性的卡通范围(By) 403
15.4.10 设定IsAdditive和IsCumulative 属性 403
15.4.11 WPF动画的岁月片类 403
15.5 故事板(Storyboard) 404
15.5.1 使用传说板的形似格式 404
15.5.2 设定Target和TargetName 406
15.5.3 操作Storyboard 406
15.6 KeyFrame 408
15.6.1 线性KeyFrame 409
15.6.2 非线性KeyFrame(Spline KeyFrame) 412
15.6.3 离散KeyFrame(Discrete KeyFrame) 414
15.7 本章小结 416
第四篇 开发WPF产品
第①6章 多媒体技术及其应用 418
16.1 播放.wav声音格式的SoudPlayer和SoundPlayerAction 418
16.1.1 装载.wav文件 418
16.1.2 播放.wav文件 419
16.1.3 停播 419
16.1.4 在XAML中使用SoundPlayerAction 419
16.2 播放种种格式的声息和图像 420
16.2.1 播放方式 421
16.2.2 使用MediaPlayer实例 422
16.2.3 使用MediaElement和MediaTimeline实例 426
16.3 语音合成和话音识别 430
16.3.1 尝试Windows Vista的口音功能 431
16.3.2 使你的次第发音 432
16.3.3 PromptBuilder和SSML 433
16.3.4 语音识别中的语法 434
16.4 本章小结 436
第叁7章 定制控件和排版 437
17.1 用户控件和自定义控件 437
17.2 创设用户控件(User Control) 439
17.2.1 设计用户控件UI 439
17.2.2 开发支持用户控件UI的逻辑 442
17.3 创设自定义控件(Custom Control) 446
17.4 创立自定义排版(Custom Panel) 459
17.4.1 照片浏览器 461
17.5 本章小结 471
第③8章 综合应用 472
18.1 Ribbon界面大概浏览 472
18.2 项目标团体 473
18.3 管理Generic.XAML文件 475
18.4 开发自定义控件 476
18.4.1 自定义控件间的关联 476
18.4.2 Ribbon按钮 477
18.4.3 Ribbon分组(Group) 483
18.4.4 RibbonTabItem 492
18.4.5 RibbonApplicationMenuItem 493
18.4.6 RibbonApplicationMenu 495
18.4.7 RibbonQAToolBar 496
18.4.8 RibbonBar 497
18.4.9 RibbonWindow 498
18.4.10 支持差别皮肤 514
18.5 使用Ribbon自定义控件实例 516
18.6 本章小结 525
参考文献 526

属性上的特点能够是 PropertyMetadata也许UIPropertyMetadata
中的二个,私下认可值能够通过那两个性子来设置。即使不加那多个特色,那暗中同意值即是null也许0

触发器

运用触发器,你能自动化简单的样式改变。

触发器通过Style.Triggers集合链接到样式。每一种样式能有好多少个触发器,并且每个触发器是System.Windows.TriggerBase派生类的七个实例。

名字 描述
Trigger 观察依赖属性一个改变,然后使用一个设置器改变样式。
MultiTrigger 这类似于触发器,但是结合多重的条件。触发器生效之前,所有条件必须被满足。
DataTrigger 触发器与数据绑定一起工作。它类似于触发器,除了它监视绑定数据的改变。
MultiDataTrigger 这结合多个数据触发器。
EventTrigger 事件发生时,触发一个动画。
  <Window.Resources>
        <Style x:Key="buttonStyle">
            <Setter Property="Foreground" Value="#999999"/>
        </Style>

    </Window.Resources>

如假设繁体属性类型暗许值,能够经过重写 OnOverrideMetadata 来安装

简易触发器

你能附加简单触发器到任何借助属性。例如,你能响应Control类的IsFocused,IsMouseOver,和IsPressed属性改变,创立鼠标悬停和纽带效应。

种种不难触发器标识你监视的属性,以及你希望的值。当那值爆发,你存款和储蓄在Trigger.Setters集合中的设置器被应用。(不幸地,不能够运用更世故的触发器逻辑,比较八个值落在三个限量内,执行一个乘除,等等。在这一个境况下,你应转而利用3个风浪处理器。)

此间是2个触发器,当按钮获得键盘主题时,背景变为暗浅梅红:

<Style x:Key="BigFontButton">
  <Style.Setters>
    <Setter Property="Control.FontFamily" Value="Times New Roman" />
    <Setter Property="Control.FontSize" Value="18" />
  </Style.Setters>

  <Style.Triggers>
    <Trigger Property="Control.IsFocused" Value="True">
      <Setter Property="Control.Foreground" Value="DarkRed" />
    </Trigger>
  </Style.Triggers>
</Style>    

不需求写逻辑反转触发器。触发器甘休利用,成分就死灰复燃它的正规的外观。

触发器没有改动注重属性的原始值。原始值也许是当地值,也恐怕是样式值。触发器一失活,触发从前的值就再也可用。

触发器集合能够归纳八个触发器。假如,贰个上述的触发器修改同贰性情质,位于列表最后的触发器赢。

它不关怀哪三个触发器先产生。例如,WPF不爱抚在您点击按钮此前一个按钮是或不是拿走宗旨。触发器被排列在您标记中的地方是它唯一关注的事。

MultiTrigger提供3个尺度集合,让您定义一密密麻麻的性质和值的结合。惟有拥有的条件都是真,触发器开启:

<Style x:Key="BigFontButton">
  <Style.Setters>
    ...
  </Style.Setters>
  <Style.Triggers>
    <MultiTrigger>
      <MultiTrigger.Conditions>
        <Condition Property="Control.IsFocused" Value="True">
        <Condition Property="Control.IsMouseOver" Value="True">
      </MultiTrigger.Conditions>
      <MultiTrigger.Setters>
        <Setter Property="Control.Foreground" Value="DarkRed" />
      </MultiTrigger.Setters>
    </MultiTrigger>
  </Style.Triggers>
</Style>

下一场调用即可

 

事件触发器

事件触发器等待内定的轩然大波被吸引。事件触发器要求你提供一多元作为修改控件。那么些行为被用于采用三个卡通。

事件触发器也是放在Style.Triggers集合中:

<Style.Triggers>
    <EventTrigger RoutedEvent="Mouse.MouseEnter">
        。。。
    </EventTrigger>
</Style.Triggers>

见296页。

 <Button Content="Button" Height="23" Style="{StaticResource buttonStyle}"  
HorizontalAlignment="Left" Margin="10,204,0,0" Name="button5" VerticalAlignment="Top" Width="75" />
       protected override void OnOverrideMetadata(OverrideMetadata overridePropertys)
       {
            base.OnOverrideMetadata(overridePropertys);
            overridePropertys.Override("StrokeStyle", new UIPropertyMetadataAttribute(new Stroke(1), false, false, true));
        }

行为

只要给样式钦定一体系型,则属性中的名字能够去掉,加上钦命指标项目(TargetType)

 

支撑作为

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

 

明白作为模型

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

数码绑定:

创制作为

一旦别的控件也是派生自Control能够将Style1钦定给这么些控件也是适合的。那样就能使多样要素共用一种体制。

var bind = label["Text"] <= "Test";//右到左数据绑定,数据源是DataContext的属性

var bind = label["Text"] >= "Test";//左到右数据绑定,数据源是DataContext的属性

var bind = label["Text"] != "Test";//右到左数据绑定,只传递一次 ,数据源是DataContext的属性

var bind = label["Text"] == "Test";//双向绑定,数据源是DataContext的属性,双向绑定需要对象实现INotifyPropertyChanged



var bind = label["Text"] <= button["Test"];//右到左数据绑定

var bind = label["Text"] >= button["Test"];//左到右数据绑定

var bind = label["Text"] != button["Test"];//右到左数据绑定,只传递一次

var bind = label["Text"] == button["Test"];//双向绑定

利用行为

如:

 

Blend的统一筹划时作为辅助

  <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)

当事件触发可能性质变化的时候调用方法

  重用样式指的是,样式能够拥有目的所未曾的习性。比如,大家想定义一种样式,在那之中含有不想被有着因素共享的属性,而只盼望这几个非共享属性应用到特定的因素上。那时,大家就足以去掉目的项目,重新加上前缀。

label.AddCommand("MouseDown","button1_Click","CommandContext", Wtf.Windows.CommandParameter.EventArgs);

        /// <summary>
        /// 添加处理命令,命令方法在CommandContext或者其他属性的对象上
        /// </summary>
        /// <param name="eventName">触发的事件名或者属性名</param>
        /// <param name="methodName">命令方法名</param>
        /// <param name="propertyName">命令对象所在的属性名</param>
        /// <param name="ps">方法参数,可以是自定义的数据或者相关属性或者事件的数据</param>
        public void AddCommand(string eventName, string methodName, string propertyName = "CommandContext", params object[] ps)
    <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中的样式覆盖。最终的外观取决于近日的体制或许性质。比如,给叁个因素钦点了3个体裁,其中包蕴FontSize属性值为14。而在要素定义时,重新给它的性情FontSize设置了二个值18。最后成分文本的FontSize将为18。

Brush, Color :  “#0000ff” “#ff0000ff” “255,255,255” 
“255,255,255,255”  颜色字符串转换,按顺序是r,g,b、a,r,g,b

 

 

  <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>

FloatValue: “百分之十” “100” “zero” “auto”  100  100.5    
数字恐怕百分比字符串转换,整形,浮点数据自动转换

 拓展样式(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>

 

③ 、成分类型样式

按钮的鼠标操作功效,鼠标移入移出按下背景观变化

 一般的话,大家盼望用户界面上的控件拥有统一外观,比如具有按钮大小同等、颜色相同等,那时大家得以定义一种元素的样式,对3个限量内的享有因素都灵验,那正是因素类型样式。

            

  同一体系成分共享外观

 

  假如希望叁个世界级窗口内全体的要素,具有同等的体制和外观——可以如此达成:1.在第拔尖窗口财富中定义二个样式,不标记x:Key,将TargetType设置为一种成分类型。2.定义成分,不用钦赐Style,窗口中装有该类型的因素,都将选取能源中定义的样式,并保有合并外观。

       Styling.Trigger hover = new Styling.Trigger { Condition = Styling.Conditions.Equals, Property = "IsMouseOver", Value = true };

            hover.Setters.Add("Background", Drawing.Brush.Parse("#ff0000"));

            Styling.Trigger normal = new Styling.Trigger { };

            normal.Setters.Add("Background", Drawing.Brush.Parse("#00ff00"));

            Styling.Trigger press = new Styling.Trigger { Condition = Styling.Conditions.Equals, Property = "IsMouseCaptured", Value = true };

            press.Setters.Add("Background", Drawing.Brush.Parse("#ffff00"));

            label.Triggers.Add(normal);

            label.Triggers.Add(hover);

            label.Triggers.Add(press);

            label.MouseDown += delegate
            {
                label.CaptureMouse();
            };

            label.MouseUp += delegate
            {
                label.ReleaseMouseCapture();
            };
<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>

 

 效能范围

 

  以上的共享外观不仅局限于顶尖窗口,而是依照你定义的体裁所在的限制。假若你将样式定义在3个面板能源中,共享外观将唯有效用该面板。

WtfObject
的性质设置的值优先级比触发器样式设置的值要高,所以当你设置了属性值,触发器样式大概没有意义

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

 

 

 

<Window ...>
    <Window.Resources>
        <!--Button 样式-->
        <Style TargetType="{x:Type Button}">
            <Setter Property="Foreground" Value="Green"></Setter>
        </Style>           
    </Window.Resources>
</Window>

添加UI成分,UI成分能够并行嵌套

面板范围(功能于该面板)

            var root = testControl1.RootUIElement;
            root.Foreground = "#ff0000";
            root.FontFamily = "微软雅黑";
            root.FontSize = 16;
            root.Children.Add(label);
            root.Children.Add(new Windows.Shapes.Ellipse
            {
                Stroke = "#0000ff",
                Fill = "white",
                Width = 40,
                Height = 20,
                MarginLeft = 30,
                MarginTop = 30
            });

            root.Children.Add(new Windows.Shapes.Ellipse
            {
                Stroke = "#0000ff",
                Fill = "white",
                Width = 40,
                Height = 20,
                MarginRight = "30%",
                MarginTop = 30

            });    
<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>  

要素布局,支持百分比布局,margin调整定位,暗中认可居中。

肆 、编制程序控制样式

 

透过代码更改按钮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");
}
            var t = new Trigger();
            Storyboard ss = new Storyboard();
            ss.Duration = new TimeSpan(0, 0, 0, 0, 500);
            var tl = new Timeline(1);
            tl.KeyFrames.Add(new KeyFrame<FloatValue> { Property = "Height", Value = 300, Ease = new BounceEase(), AnimateMode = AnimateMode.EaseIn });
            tl.KeyFrames.Add(new KeyFrame<FloatValue> { Property = "Width", Value = "30%", Ease = new BounceEase(), AnimateMode = AnimateMode.EaseIn });
            tl.KeyFrames.Add(new KeyFrame<GeneralTransform> { Property = "RenderTransform", AnimateMode = AnimateMode.EaseOut, Value = new GeneralTransform { Angle = 30 }, Ease = new ElasticEase() });
            //tl.KeyFrames.Add(new KeyFrame<SolidColorBrush> { Property = Shape.FillProperty, Value = "White" });
            ss.Timelines.Add(tl);
            t.Property = "IsMouseOver";
            t.Value = true;
            t.Animation = ss;
            t.Setters.Add("Fill", Brush.Parse("#fff"));
            v.Triggers.Add(t);

 五、触发器

 

体制(Styles)由三部分组成:设置器(Setter)、触发器(Triggers)、能源(Resources)。触发器,让体制的选择更为规范、灵活和便捷。触发器(Triggers)首要分为三类,属性触发器(检查从属属性即WPF元素自己性质)、数据触发器(检查任意可绑定的性质)、事件触发器(用于监听事件)。

尽管写自定义控件,继承Wtf.Windows.Controls.Control
 然后重写InitializeComponent
把体制定义代码写在里面,尽管再度卫冕修改的话,能够重写覆盖。

个性触发器

dll一时半刻不提供下载

  检查从属属性的值,即WPF成分自个儿性质。比如按钮的始末、字体的尺寸、颜色等等。

澳门葡京备用网址 2

<Window.Resources> 
       <Style TargetType="Button">    
        <Style.Triggers>           
     <Trigger Property="Content" Value="按钮">         
           <Setter Property="ToolTip" Value="这是一个按钮">
</Setter>              
  </Trigger>         
   </Style.Triggers>   
     </Style>    
</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的值一样,不然掉不出去
 澳门葡京备用网址 3

多属性触发器

 <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>

澳门葡京备用网址 4

多规格属性触发器

  <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>

 数据触发器

  能够检查任意可绑定的性质,比如CL智跑对象属性、XPath申明等。相对于属性触发器,数据触发器平时用来检查不可知的目的属性。

   

<Window x:Class="WpfApplication2.样式的用法.styleDemo"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="styleDemo" Height="300" Width="300">
    <Window.Resources>
        <Style TargetType="Button">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=Name}" Value="dd">
                    <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>
</Window>

  public partial class styleDemo : Window
    {
        public styleDemo() 
        {
            InitializeComponent(); 
            DataContext = new Person("dddd", "dd"); }

        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>

后续..

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website