C#WPF XAML事件、资源、样式

C#WPF XAML事件、资源、样式

一、事件(Event)
1.XAML帮助应用管理用户输入,执行不同的行为 、引入增强型事件处理系统-Routed Event(路由事件)、事件常常被用于控制更改通知操作 。
(1).事件定义:事件系统在WPF中被升级进化称为路由事件(Routed Event),并在其基础上衍生出命令传递机制。这些机制很大程度上减少了对程序员的束缚,让程序的设计和实现更加灵活,模块之间的耦合度也进一步降低。
(2)、可以通过对于控件,然后“转到定义”或者“查看定义”方式进行后台事件的创建,还可以通过Visual Studio 2015开发程序中属性窗口的事件功能双击相应的事件进行前后台一套完整的事件创建。
在这里插入图片描述
2.路由事件处理方式
路由三种策略(处理方式)路由事件使用以下三种路由策略之一:
(1)、浮升(冒泡): 调用事件源上的事件处理程序。 路由事件随后会路由到后续的父级元素,直到到达元素树的根。 大多数路由事件都使用浮升路由策略。 浮升路由事件通
常用于报告来自不同控件或其他 UI 元素的输入或状态变化。
(2)、隧道: 最初将调用元素树的根处的事件处理程序。 随后,路由事件将朝着路由事件的源节点元素(即引发路由事件的元素)方向,沿路由线路传播到后续的子元素。
合成控件的过程中通常会使用或处理隧道路由事件,通过这种方式,可以有意地禁
止复合部件中的事件,或者将其替换为特定于整个控件的事件。 在 WPF 中提供的输
入事件通常是以隧道/浮升对实现的。 隧道事件有时又称作预览事件,这是由该对所
使用的命名约定决定的。
(3)、直接: 只有源元素本身才有机会调用处理程序以进行响应。 这类似于 Windows 窗
体用于事件的 “路由”。 但是,与标准 CLR 事件不同,直接路由事件支持类处理 (类
处理将在下一节中介绍) 并可由 EventSetter 和使用 EventTrigger 。
(4)、冒泡事件:在逻辑树里一个根元素定义了一个事件充当“源元素”执行事件的过程是从“源元素”开始一直到根元素。
(5)、 隧道事件:在逻辑树里一个根元素定义了一个事件充当“源元素”执行事件的过程是从根元素开始一直到“源元素”。
(6)、直接路由事件:直接定位到事件上的按钮。
C#WPF XAML事件、资源、样式_第1张图片
3.路由事件实现
(1).路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件。路由事件是一个 CLR 事件,可以由 RoutedEvent 类的实例提供支持并由 Windows Presentation Foundation (WPF) 事件系统来处理。
(2)、中断事件路由 :所有的路由事件都共享一个公共的事件数据基类 RoutedEventArgs。 RoutedEventArgs 定义了一个采用布尔值的 Handled 属性。 Handled 属性的目的在于,允许路由中的任何事件处理程序通过将 Handled 的值设置为 true 来将路由事件标记为“已处理”。
(3)、结果为冒泡事件:点击粉红色区域“YesTB”首先弹出“TextBlock”,再弹出“Panel”弹出框,点击灰色区域弹出“button”提示弹出框。
(4)、冒泡事件例子中:e.Handled=true加在YesTB_PreviewMouseUp中,加入后,点击YesTB,将只弹出“button”。
(5)、预览事件(隧道事件)例子中:e.Handled=true家在StackPanel_PreviewMouseUp中,加入后,点击YesTB,将只弹出“panel”。
C#WPF XAML事件、资源、样式_第2张图片
(6)、在 Windows Presentation Foundation (WPF) 中,元素以元素树结构形式排列。 父元素可以参与处理最初由元素树中的子元素引发的事件。 这都是因为事件路由。
(7)、路由事件通常遵循以下两个路由策略之一:浮升(冒泡)和隧道。 此示例重点介绍浮升事件,并使用ButtonBase.Click事件可显示路由的工作原理。
(8)、下面的示例创建两个Button控制,并使用XAML特性语法将事件处理程序附加到公用父元素,它在此示例中为StackPanel。 而不是将单个事件处理程序附加每个Button子元素,该示例使用特性语法将附加到的事件处理程序StackPanel父元素。 此事件处理模式展示了如何使用事件路由技术来减少附加处理程序的元素数。 每个的所有浮升事件Button通过父元素路由。
(9)、请注意,在父StackPanel元素中,Click指定为该属性进行部分限定的命名的事件名称Button类。 Button类是ButtonBase派生的类具有Click事件在其成员列表中的。 如果要处理的事件不在附加路由事件处理程序的元素的成员列表中,则有必要使用这种部分限定技术来附加事件处理程序。
C#WPF XAML事件、资源、样式_第3张图片
4.常用事件
(1)、如常用的“MouseDown(鼠标点击事件)”、“MouseEnter(鼠标移入)”、
“MouseLeave(鼠标移出)”、“MouseLeftButtonDown(鼠标左键按下)”、“MouseLeftButtonUp(鼠标右键按下)”等等。
C#WPF XAML事件、资源、样式_第4张图片
二、资源
1.资源理解:在应用程序的不同位置重用的对象,可以在任何元素上定义资源,但是资源通常是在根元素上定义的。当在页面根元素上定义一个资源时,页面逻辑树中的所有元素都可以访问它,并且您可以重用相同的资源来设置接受该资源表示的类型的任何属性的值。
(1)、XAML资源的示例包括画笔和样式,每个框架级别的元素(FrameworkElement或FrameworkContentElement)都有一个resource属性,该属性包含资源定义的资源(作为ResourceDictionary)。
C#WPF XAML事件、资源、样式_第5张图片
2.资源字典(ResourceDictionary)
如果想用代码创建一个完整的WPF应用程序,且可能还想用代码在该应用程序中创建任
何资源。为此,创建一个新的ResourceDictionary实例,然后使用对ResourceDictionary.
add .的连续调用将所有资源添加到字典中。然后,使用由此创建的ResourceDictionary
在页面范围或Application.Resources中出现的元素上设置Resources属性。还可以将
ResourceDictionary作为独立对象维护,而不需要将其添加到元素中。但是,如果您这样做,您必须按项目键访问其中的资源,就好像它是一个通用字典一样。资源字典中的每
个资源必须有一个惟一的键。在标记中定义资源时,通过x: key指令分配惟一的键。通
常,键是字符串;但是,你也可以通过使用适当的标记扩展将其设置为其他对象类型。定
义资源之后,可以使用指定键名的资源标记扩展语法引用要用于属性值的资源。
3.资源字典分类
(1)、WPF应用程序中,XAML资源分为StaticResource(静态资源) 和 DynamicResource(动态资源)。
(2)、Windows8应用中,XAML资源仅支持StaticResource(静态资源),资源应用域不同,XAML资源可分为FrameworkElement.Resources和Application.Resources。
(3)、FrameworkElement.Resources(页面资源字典)是将资源对象应用于同一个对象数的不同对象上,称之为页面资源,通常被定义在XAML页面根元素上。
C#WPF XAML事件、资源、样式_第6张图片
(4)、放在Application.Resources是贯穿整个应用级别的资源,通常被定义在App.xaml页面。
C#WPF XAML事件、资源、样式_第7张图片
(5)、Application.Resources(资源字典整合)。
在这里插入图片描述
4.合并资源字典属性
所有的资源项在最终都会被整合到Resource Dictionary中的,也就是说无论是
FrameworkElement的Resources,还是Window的Resources,还是Application的
Resources,还是特定的ResourceDictionary中定义的resources在整个应用编译执行的
时候实际上他们都在一起的作为可遍历集合共同存在于一个相对会话空间内的。 我们也
提到过Resource的key是可以被允许有相同的,这样在遍历不同相对地址的Resource
Dictionary时会根据StaticResource或者DynamicResource的lookup behavior来确定哪个有效。通常为了维护和灵活性的考虑,我们通常会将Resource Dictionary文件分成好几
个,但在某些场合下我们只需要用其中某些资源,那么我么可以将资源从几个独立的文
件中提取并合并。
(1)、在“MainWindow.xaml”中设置样式,新建两个资源字典:Dictionary1.xaml、Dictionary2.xaml,在Dictionary1.xaml中设置画刷,Dictionary2.xaml中设置样式,然后通过“App.xaml”进行资源字典整合。
C#WPF XAML事件、资源、样式_第8张图片
三、样式
1.样式分类:属性样式(直接通过UI元素的属性设置的样式)、内联样式(通过在UI元素中入Style节点来设置样式)、引用样式(定义在资源字典中的样式)。
C#WPF XAML事件、资源、样式_第9张图片
(1)、属性样式 :类似于在HTML中直接通过HTML元素属性设置的样式,直接在一个控件中设置的样式。
在这里插入图片描述
(2)、 内联样式内联样式和模板的限制
在可扩展应用程序标记语言 (XAML)中 ,样式和模板属性在技术上可以通过以下两种方
式之一进行设置。 您可以使用特性语法(属性语法)来引用资源中定义的样式,例如 < 对
象 Style="{StaticResource myResourceKey }" …/> 。 或者,可以使用属性元素语法来
定义内联样式。
在这里插入图片描述
(3)、页面级别的内联样式,实际上是设置元素的Style属性若内联样式与属性样式对同一属性进行设置,以属性设置的样式为准,如果把“Background=“SkyBlue””删除则样式背景变红色,体现了样式的优先级。
C#WPF XAML事件、资源、样式_第10张图片
(4)、引用样式
资源字典可在多处定义,因此引用样式也可以在多处定义,引用样式可以分为:
(1).页面级样式(写在页面上)页面级样式定义在页面的资源字典中,作用范围为整个页面。
(2).应用程序级样式:应用程序级样式(写在App.xaml里面与页面级样式的定义方式和应用方式相同,差别有两个方面:定义位置不同、作用范围不同。
2.Style中的Setter
(1)、Setter,设置器,(属性值的)在给属性赋值的时候一般都采用“属性名=属性值”的形式。Setter类的Property属性用来指明你想为目标的那个属性赋值;Setter类的Value属性则是你提供的属性值。
(2)、例子中在Window的资源词典中放置一个针对TextBlock的Style,Style中使用若干
Setter来设定TextBlock的一些属性,这样程序中的TextBlock就会具有统一的风格,除非你使用{x:Null}显示地清空Style。
(2)、Style设置器里有两个值:Property(指定的是定义控件如:Button、TextBlock等等的属性如:TextBlock,其中TextBlock又有Text值,而Button里没有Text值)、Value值是样式“FontSize”里的值。
(3)、没有设置 x:Key所以表示在里所有的TextBlock都应用到同一个样式。
(4)、因为Style的内容属性是Setters,所以我们可以直接在

(3)、下面例子中,当TextBox的Text长度小于8个字符时其Border会保持粉红色,当输入的数字长度小于8位数时,输入框为粉红色。
C#WPF XAML事件、资源、样式_第11张图片
4.多数据条件触发器MultiDataTrigger
有时我们会遇到要求多个数据条件同时满足时才能触发变化的需求,此时可以考虑使
用MultiDataTrigger。
5.由事件触发的EventTrigger
EventTrigger是触发器中最特殊的一个。首先,它不是由属性值或数据的变化来触发
而由事件来触发;其次,被触发后它并非应用一组Setter,而是执行一段动画。因此,UI
层的动画效果往往与 EventTrigger事件触发,另一个由MouseLeave事件触发。
(1)、鼠标移入元素从小变大。
C#WPF XAML事件、资源、样式_第12张图片

你可能感兴趣的:(C#,WPF,c#,wpf)