在Button样式中添加EventSetter,理解路由事件
XML
<Window.Resources>
<Style x:Key="ButtonStyle2" TargetType="{x:Type Button}">
<EventSetter Event="Click" Handler="b1SetColor"/>
</Style>
</Window.Resources> <Button x:Name="butrouter" Style="{DynamicResource ButtonStyle2}" Click="butrouter_Click" />
CS
private void butrouter_Click(object sender, System.Windows.RoutedEventArgs e)
{
// TODO: Add event handler implementation here.
} private void b1SetColor(object sender, System.Windows.RoutedEventArgs e)
{
// TODO: Add event handler implementation here. }
先执行butrouter_Click,再执行b1SetColor
之前有个文章是说样式的设置问题,可以参考这个 wpf中的样式
本文章主要说样式中事件EventSetter和触发器trigger
1.EventSetter
EventSetter这个理解比较简单,就是给样式使用者添加一个事件,比如给按钮添加点击事件,提供了另外一个方式来给控件添加事件
比如这个style
<Style TargetType="Button">
<Setter Property="FontSize" Value="40"></Setter>
<EventSetter Event="Click" Handler="xx"></EventSetter>
</Style>
定义了一个button的style,设置字体大小
EventSetter 就是事件设置,event表示是什么事件,handler表示该事件关联哪个方法
这样的话就是说本window内的所有button都有有点击事件交给xx方法来处理
2.trigger触发器
trigger这个也是style的属性之一,触发器顾名思义就是在使用style样式的元素或者控件的某些属性发生变化的时候才会触发这个事件
trigger就定义了元素或者控件如何响应特点属性发生变化时候进行处理,比如用户输入等等,鼠标移动
典型的trigger这样定义
<Style TargetType="Button">
<Setter Property="FontSize" Value="40"></Setter>
<EventSetter Event="Click" Handler="xx"></EventSetter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="FontSize" Value="20"></Setter>
<Setter Property="Foreground" Value="blue"></Setter>
</Trigger>
</Style.Triggers>
</Style>
trigger仍在在style中定义。这个定义表示,当button有IsMouseOver的这个属性变化成True的时候,会开始对他的fontsize和foreground的属性发生变化
通过运行vs就会发现,鼠标在button上停留的时候button的字体大小会变小而且颜色会变蓝色,鼠标离开以后就会恢复回来
3.MultiTrigger
多触发器,这个意思是说只有在两个或者两个以上的属性发生变化的时候才会引发触发器,不像之前的例子一个属性变化就会引发触发器
典型语法,仍然在style中
<style>
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>//罗利条件,条件的集合,
<Condition Property="IsPressed" Value="true"></Condition>
<Condition Property="IsMouseOver" Value="true"></Condition>
</MultiTrigger.Conditions>
<Setter Property="FontStyle" Value="Italic"></Setter>//在以上条件下才发生的属性变化
</MultiTrigger>
</ <Style.Triggers>>
</style>
4.datatrigger
数据触发和trigger类似,不同的是 binding代替了property属性
<style>
< Style.Triggers>
<DataTrigger Binding="{Binding ElementName=tb,Path=Text.Length}" Value="0">
<Setter Property="IsEnabled" Value="false"></Setter>
</DataTrigger>
</Style.Triggers>
</style>
这个绑定设置到了一个textbox文本控件,如果textbox控件内容为空的时候,就会引发按钮isenabled=false
当然默认启动的时候textbox内容就是为空,所以初始化的时候按钮的isenabled=false,只有文本框内容输入内容的时候按钮的isenabled才等true
此外还有一个MultiDataTrigger,可以参考3,其实一样的
深入理解 https://blog.csdn.net/lanse_my/article/details/37602547
另外分享一个绑定控件https://www.cnblogs.com/ligl/p/5636899.html WPF 绑定ListBox和ListView
在Button样式中添加EventSetter,理解路由事件的更多相关文章
- C# Note16: wpf window 中添加enter和双击事件
一.添加回车(enter)事件 在C#编程时,有时希望通过按回车键,控件焦点就会自动从一个控件跳转到下一个控件进行操作. 以用户登录为例,当输入完用户名和密码后, 需要点击登录按钮,而登录按钮必须获 ...
- 【WPF学习】第十三章 理解路由事件
每个.NET开发人员都熟悉“事件”的思想——当有意义的事情发生时,由对象(如WPF元素)发送的用于通知代码的消息.WPF通过事件路由(event routing)的概念增强了.NET事件模型.事件路由 ...
- 为什么要在<button>元素中添加type属性
在HTML中<button> 标签定义一个按钮. <button type="button">Click Me!</button> 在 butt ...
- Vue中添加新的路由并访问
1.搭建好Vue脚手架(这里使用的版本是Vue2.0) 2.在代码编辑器(这里使用的是Sublime Text)打开项目文件夹 3.在文件目录src中的component下创建一个新的vue页面,写入 ...
- CSS样式中ClearBoth的理解
在CSS中我们会经常要用到“清除浮动”Clear,比较典型的就是clear:both; CSS手册上是这样说明的:该属性的值指出了不允许有浮动对象的边.这个属性是用来控制float属性在文档流的物理位 ...
- WPF教程六:理解WPF中的隧道路由和冒泡路由事件
WPF中使用路由事件升级了传统应用开发中的事件,在WPF中使用路由事件能更好的处理事件相关的逻辑,我们从这篇开始整理事件的用法和什么是直接路由,什么是冒泡路由,以及什么是隧道路由. 事件最基本的用法 ...
- 在Asp.Net Core中添加区域的简单实现
使用区域,可以有效的对业务进行隔离,各种业务及分工可以更灵活.在Asp.Net Core中启用区域也是极简单的. 使用步骤: 1.在 Startup.cs 中添加区域的路由: app.UseMvc(r ...
- Wpf自定义路由事件
创建自定义路由事件大体可以分为三个步骤: ①声明并注册路由事件. ②为路由事件添加CLR事件包装. ③创建可以激发路由事件的方法. 以ButtonBase类中代码为例展示这3个步骤: public a ...
- WPF:自定义路由事件的实现
路由事件通过EventManager,RegisterRoutedEvent方法注册,通过AddHandler和RemoveHandler来关联和解除关联的事件处理函数:通过RaiseEvent方法来 ...
随机推荐
- Java实现贪吃蛇游戏(含账号注册登录,排行榜功能)
这是我第一次工程实践的作业,选题很多,但我只对其中的游戏开发感兴趣,可游戏就两三个类型,最终还是选择了贪吃蛇.其实就贪吃蛇本身的代码实现还算是比较简单的,可是实践要求代码行达到一定数量,所以我就额外给 ...
- Qt时间转换 当前时间
当前时间 qDebug() << QTime::currentTime().toString(Qt::ISODate); //"15:23:48" qDebug() & ...
- DjangoForm 提交验证
用户提交数据的验证 1.创建模版 -- class LoginForm(forms.Form):.... 2.将请求交给模版,创建一个对象 -- obj = LoginForm(request.POS ...
- MySQL循环日期
DROP PROCEDURE IF EXISTS `insertManyDate`$$ CREATE DEFINER=`root`@`%` PROCEDURE `insertManyDate`(IN ...
- Django框架 --序列化组件(serializer)
一 .Django自带序列化组件 Django内置的serializers(把对象序列化成json字符串) from django.core import serializers from djang ...
- Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n ...
- VC 静态库与动态库(三)动态库创建与使用_隐式链接
动态库分为二种,一种隐式链接,另一种显示调用.不论哪种动态库,本质都是运行时动态加载 隐式链接:程序运行时,由编译系统自动加载动态库,然后根据程序的引入表进行重定位,当程序退出时自动卸载动态库 显示调 ...
- CF891B Gluttony
原题链接 DOWNLOAD AS PDF 题目大意 给你一个有\(n\)个元素的数组\(a\),让你构造一个数组\(b\),满足从 \(a\).\(b\)中任选出\(k\)个下标对应的元素,它们的和不 ...
- linux命令行常用光标移动快捷键(转)
转自:https://www.cnblogs.com/aslongas/p/5899586.html Linux 命令行快捷键 涉及在linux命令行下进行快速移动光标.命令编辑.编辑后执行历史命令. ...
- (day48作业)jQuery+Bootstrap练习题
目录 一.图书管理系统页面搭建 二.jQuery练习题 一.图书管理系统页面搭建 <!DOCTYPE html> <html lang="en"> < ...