WPF样式和行为,还没到家

By admin in 4858.com on 2019年3月25日

Wtf(权且命名,随便起的 =
_=),模仿WPF的框架,还未曾周到,唯有不难的根底成分,协助数据绑定。尽管匡助mono不过mono有bug

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

      
前面简单的讲到了wpf中二种体制的用法,wpf有着类似web中的CSS一样,为界面上的因素定制外观,以提供更好的用户界面,那种灵活性也是winForm所不能够及的,从日前讲到的可以知道在WPF应用程序中,通过控件的属性,我们也得以完结转移控件的外观。可是,那种方法局限性大、不灵活且不方便人民群众尊敬,比如2个,1个按钮的样式能够这么,假设有二十,二贰10个,甚至越来越多,难道也如此吗,显明那不是很好的抉择,假使大家将上述控件的性质归结起来,写到一段样式中,为按钮钦点该样式(甚至用成分类型样式时,都不须要钦命按钮样式),全体按钮就全数合并样式和外观了。假设想修改按钮外观,我们只必要改一下体裁代码即可,全部按钮外观都会随着变动。

WPF专业编制程序指南 4858.com 1

写这么些只是兴趣爱好,感觉也没多马虎思了,借使那个UI框架完善了,某个许人乐意用?终归Windows上有WPF,而且C#跨平台供给也不多呀。作者对WPF也不算熟练,要到家的话,还有很多要写。一大堆常用控件和设计器。但是本人绝不XML来讲述,而是一向用C#来定义,设计器直接生成C#代码,因为作者以为,就算有强劲的设计器,写XML便是剩下的,而且解析XML还影响属性,对于WPF,笔者觉着Xaml太啰嗦了。

行事封装一些骨干的UI功用,然后用一两行标记附加到元素上,达成效益。

体制的使用有各类格局,如内联样式(定义在要素内部)、已命名样式(为样式命名,使用时经过名称引用)、成分类型样式(为一连串型的成分,钦定一种体裁)等等。

定价 : ¥68.00

 

体制基础

WPF样式和行为,还没到家。体制是一种首要的能源。

体制是属性值的聚众,能被选用到三个因素。就好像CSS,WPF样式允许你定义格式化特性并且遍及应用程序地利用它们去承接保险一致性。就好像CSS,WPF样式能够级联通过成分树自动地运用到钦点的要素类型的目的。而且,WPF样式更强力,因为他俩能够安装任何借助属性。那表示你能够使用它们标准化格式化以外的表征,诸如控制控件的一举一动性质。WPF样式也协理触发器,那允许你当另叁脾质量被更改时改变控件的样式,并且他们可以运用模板去重定义控件的内建外观。

属性值继承,是借助属性的特点之一。当您在窗口水平设置属性时,窗口内部有着的要素将获取一致的值,除非显式地覆盖他们。

考虑下边代码:

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

4858.com,那段标记创建单个能源:多少个System.Windows.Style对象。样式对象具备二个设置器集合,带有三设置器对象,各种设置器设置1本品质。各类设置器对象提出要设置属性的名字。和该属性的值。就如全数的能源,样式对象有一个用以检索资源的重庆大学字。在本例中,关键字是BigFontButtonStyle。(遵照预订,样式关键字的尾声是Style。)

各种WPF成分只可以选取二个样式(或可以不应用样式)。叁个成分通过Style属性应用样式。例如,为布局2个按钮使用你在此之前成立的样式,按钮像那样应用样式能源:

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

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

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

Style类一共有两个基本点的质量:

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

壹 、内联样式

会员价

¥51.00(75折)

WtfObject 
也就是WPF里的DependencyObject信赖对象。继承该类的目的,全部属性暗许都以注重属性

创制3个样式对象

你能创立各个程度的财富聚集,窗口的,容器的,恐怕应用程序的。

实则,你能够直接设置控件的体制:

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

比如说下边包车型地铁为textBox加体制

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

属性写法:

安装属性

如您所见,每一种Style对象包裹2个Setter对象的集合。每种Setter对象设置一个成分的二个脾性。唯一限制是1个设置器只可以改变三个借助属性—不能够改改其余质量。

在一些动静下,你无法应用1个总结的字符串设置属性值。例如,无法利用贰个简练字符串成立八个ImageBrush对象。在那种状态下,你能用一个嵌套成分设置属性。那是二个例子:

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

 

为识别你期望设置的性质,你供给提供3个类和三个属性的名字。不过,类名字不需借使概念属性的类。它也能是此类的一个派生类。例如,考虑上边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
出版日期:二〇一〇 年一月
开本: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来定义样式。但是缺点也是鲜明的,如若有四个如此的控件指向同多少个体制,该如何做呢,只可以每种都要写,所以很不好,所以我们得以在财富中定义三个体制,然后让多少个控件调用这三个体裁即可

【编辑推荐】
完善系统,深刻应用
通俗易懂,实例足够

        /// <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
第肆章 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
第六章 画笔和画刷 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
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 口令输入框(PasswordBox) 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
第21章 数据绑定(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 多段3回柏之线(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 设定动画发轫时间BeginTime 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个盘算,等等。在那几个意况下,你应转而利用1个风浪处理器。)

这边是三个触发器,当按钮得到键盘主题时,背景变为暗玛瑙红:

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

不必要写逻辑反转触发器。触发器截至利用,成分就恢复生机它的平时的外观。

触发器没有改动依赖属性的原始值。原始值大概是本地值,也或者是样式值。触发器一失活,触发此前的值就再也可用。

触发器集合能够总结四个触发器。就算,二个以上的触发器修改同2性子质,位于列表最终的触发器赢。

它不保护哪三个触发器先产生。例如,WPF不关切在您点击按钮之前一个按钮是或不是得到主旨。触发器被排列在您标记中的地点是它唯一关注的事。

MultiTrigger提供二个规范集合,让你定义一八种的属性和值的咬合。唯有全部的标准化都是真,触发器开启:

<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中的样式覆盖。最后的外观取决于方今的体裁或然性质。比如,给二个要素钦点了一个样式,在这之中包涵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>

 

叁 、成分类型样式

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

 一般的话,大家意在用户界面上的控件拥有统一外观,比如具有按钮大小相同、颜色相同等,那时我们得以定义一种成分的体制,对三个范围内的有所因素都使得,那正是因素类型样式。

            

  同一种类成分共享外观

 

  假如希望四个世界级窗口内有着的因素,具有相同的体裁和外观——能够这么达成: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>

 

 效用范围

 

  以上的共享外观不仅局限于超级窗口,而是依照你定义的样式所在的范围。要是你将样式定义在二个面板能源中,共享外观将只有成效该面板。

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成分自己性质。比如按钮的内容、字体的轻重缓急、颜色等等。

4858.com 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的值一样,不然掉不出来
 4858.com 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>

4858.com 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>

 数据触发器

  能够检查任意可绑定的性情,比如CLCRUISER对象属性、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>

后续..

发表评论

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

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有