首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

WPF自学入门(三)WPF路由事件之内置路由事件

有没有想过在.NET中已经有了事件机制,为什么在WPF中不直接使用.NET事件要加入路由事件来取代事件呢?...既然WPF中使用这样的一个设计理念,路由事件就是特别为WPF而生,它的功能就是可以把一个事件从触发点沿着树向上或者向下传播,需要对这个事件作出反应的地方就添加一个监听器,就会有相应的反应,当然,它的传递是可以用代码来停止...好了,我已经大概了解了一些路由事件。下面先来了解一下WPF内置的路由事件和原理,然后我们来创建一个属于自己的路由事件。 1、WPF内置的路由事件 新建WPF项目,在页面上放置按钮。..., new RoutedEventHandler(Grid_MouseDown), true); 这里我想大家应该对路由事件有了大概认识了。...2、内置路由事件学习总结: 气泡事件WPF路由事件中最为常见,它表示事件从源元素扩散传播到可视树,直到它被处理或到达根元素。这样我们就可以针对源元素的上方层级对象处理事件

1.5K20

WPF路由事件路由事件的三种策略

一、什么是路由事件 路由事件是一种可以针对元素树中的多个侦听器而不是仅仅针对引发该事件的对象调用处理程序的事件路由事件是一个CLR事件。...路由事件与一般事件的区别在于:路由事件是一种用于元素树的事件,当路由事件触发后,它可以向上或向下遍历可视树和逻辑树,他用一种简单而持久的方式在每个元素上触发,而不需要任何定制的代码(如果用传统的方式实现一个操作...路由事件路由策略: 所谓的路由策略就是指:路由事件实现遍历元素的方式。 路由事件一般使用以下三种路由策略:1) 冒泡:由事件源向上传递一直到根元素。2) 直接:只有事件源才有机会响应事件。...3) 隧道:从元素树的根部调用事件处理程序并依次向下深入直到事件源。一般情况下,WPF提供的输入事件都是以隧道/冒泡对实现的。隧道事件常常被称为Preview事件。...XAML代码如下; <Window x:Class="<em>Wpf</em><em>路由</em><em>事件</em>管道策略.MainWindow" xmlns="http://schemas.microsoft.com/winfx/

1.3K10
您找到你想要的搜索结果了吗?
是的
没有找到

WPF自学入门(四)WPF路由事件之自定义路由事件

在上一篇博文中写到了内置路由事件,其实除了内置的路由事件,我们也可以进行自定义路由事件。接下来我们一起来看一下WPF中的自定义路由事件怎么进行创建吧。...创建自定义路由事件分为3个步骤: 1、声明并注册路由事件。 2、利用CLR事件包装路由事件(封装路由事件)。 3、创建可以激发路由事件的方法。...EventManager.RegisterRoutedEvent ("ReportCurrentLocation", RoutingStrategy.Bubble, typeof(EventHandler...第三个参数是路由事件处理器类型,传递的参数是自定义类。 第四个参数是拥有这个路由事件的类型。...三、封装路由事件 CLR事件的封装器,不同于依赖属性的GetValue和SetValue,这里是利用Add和Remove两个函数来给路由事件分配事件处理器。

2.3K20

学习WPF——了解路由事件

入门 我们先来看一个例子 前台代码: 后台代码: 点击按钮的运行效果第一个弹出窗口 第二个弹出窗口: 第三个弹出窗口: 路由事件解析 在上面的例子中我们看到了Button类的路由事件Click 下面我们来剖析源码...,看看Button是如何注册这个路由事件的 要使用路由事件,必须先定义路由事件 首先在Button类的基类ButtonBase中发现了路由事件的定义ClickEvent 代码中使用EventManager.RegisterRoutedEvent...注册了路由事件 这个方法包含事件的名称、路由类型等内容 定义了ClickEvent事件之后还需要对事件进行封装这里使用到了.Net的事件封装器,AddHandler和RemoveHandler用于添加和删除已注册的调用程序...修改记录 2015-1-5:完成一部分内容 2015-1-14:完成全部内容 参考资料 《Pro WPF 4.5 in C# 4th Edition》 http://www.cnblogs.com

59570

C#语法——事件,逐渐边缘化的大哥。

代码中,我们使用两种赋值模式,但实际上都是为事件testEvent添加一个委。 第二种将函数直接【添加】事件中,编译时也会把函数转换成委托【添加】事件中。...但RoutedEventHandler特别之处是,他的sender并不一定是真实的源,因为他是一个冒泡路由事件,即上升事件。...通过这两个单词,我们会清晰的了解路由事件。简单描述一下sender和source,它们一个是发送者,一个是源。 在EventHandler中,sender即source,因为它是直接事件。...而在冒泡事件中,sender不一定等于source。即发送者不一定是源。 下面我们用WPF来看看路由事件。 我们首先在XAML页面定义一个RadioButton按钮,然后设置他的模板是Button。...比如WPF虽然支持事件驱动,但MVVM在WPF下的表现堪称完美,所以WPF下的事件几乎没有人用了。

1.4K30

.NET简谈路由事件

本篇文章讲解关于路由事件的相关原理。 什么叫路由事件,字面理解就是事件是可以传递,路由的意思也好理解。路由事件其实就是,事件是会随着某种变化,来回传递。...路由事件其实在.NET2.0时期就已经存在了,只不过在一般开发过程中用不到。 从C#3.0开始,就已经封装了关于路由事件的机制。其实这种实现应该可以换个名字来解释。...我们可以给路由事件起个便于理解的名字,“事件路由设计模式”。...上面的父控件没有考虑它的子孙们需要这个消息,在WPF中就提供了事件路由的机制,我们可以捕获到子控件的事件。...); if (Console.ReadLine() == "StartClick") { //触发容器类Click事件,这时候事件路由子对象中

37310

如何监视 WPF 中的所有窗口,在所有窗口中订阅事件或者附加 UI

由于 WPF 路由事件(主要是隧道和冒泡)的存在,我们很容易能够通过只监听窗口中的某些事件使得整个窗口中所有控件发生的事件都被监听到。然而,如果我们希望监听的是整个应用程序中所有的事件呢?...路由事件路由可并不会跨越窗口边界呀? 本文将介绍我编写的应用程序窗口监视器,来监听整个应用程序中所有窗口中的路由事件。这样的方法可以用来无时无刻监视 WPF 程序的各种状态。...---- 其实问题依旧摆在那里,因为我们依然无法让路由事件跨越窗口边界。更麻烦的是,我们甚至不知道应用程序有哪些窗口,这些窗口都是什么时机显示出来的。...于是,我们只需要遍历 Windows 集合便可以获得应用程序中的所有窗口,然后对每一个窗口监听需要的路由事件。...我们可以利用当前窗口的激活与激活的切换时机再去寻找新的窗口。 于是,一开始的时候,我们可以监听一些窗口的激活事件

37840

2018-12-13-不要相信那些事件引发者

最近发现C#的事件wpf的dispatcherobject在一起使用会有一些不容易发觉的问题。 ---- 我们都知道C#的事件原理,实际上是存储了一系列方法的委托。...所以从中可以发现显而易见的一些问题比如: 监听事件执行顺序无法保证 耗时委托执行拖慢其他业务注册的方法 资源泄露问题 这些很多人都会聊,我们就不讲了~ 今天重点讲wpf会遇到的跨线程访问的问题。...我们都知道wpf的DispatcherObject,必须在创建它的Dispatcher上执行,而由于C#的事件机制,这个调用线程(及关联的Dispatcher)的控制权交给了事件引发者。...最佳实践:我们在事件注册函数中不相信那些事件引发者,(路由事件等确定是UI线程引发的事件除外),针对UI元素调用使用Dispatcher.Invoke,针对耗时操作使用异步方法。...private event EventHandler _userLogined; public event EventHandler UserLogined {

34120

WPF面试题大全,秒杀面试官必备

10、WPF路由事件的哪三种方式/策略(冒泡 直接 隧道)? 11、解释Routed Events(路由事件)与Commands(命令)?...10、WPF路由事件的哪三种方式/策略(冒泡 直接 隧道)? 答:直接路由事件(Direct Routed Events):直接路由事件是在特定元素上引发并处理的事件。...处理隧道路由事件的元素通常是根元素或目标元素的父级元素。. 冒泡路由事件(Bubbling Routed Events):冒泡路由事件从触发事件的元素开始,沿着元素树向上传播,直到根元素。...11、解释Routed Events(路由事件)与Commands(命令)? 答:在 WPF 中,路由事件和命令是两种用于处理用户输入和应用程序行为的常用机制。...命令可以被路由事件处理程序使用来执行操作。 12、C#中的表单界面上,有一个DataGrid控件,如何将SQL数据库里的一个表中的数据显示在这个控件上,请描述一下操作方法及步骤 ?

48110

CodeWF.EventBus:轻量级事件总线,让通信更流畅

IOC和IOC方式:IOC方式:需要安装CodeWF.EventBus包,适用于未使用IOC的模板程序,比如WPF、Winform、AvaloniaUI、控制台程序,当然ASP.NET Core也能用...IOC方式使用适合于未使用IOC方式使用事件总线,比如在WPF、Winform、AvaloniaUI、控制台等程序中直接使用事件帮助类的静态实例,下面是使用步骤。...IOC功能builder.Services.AddSingleton();// 1、注册事件总线,将标注`EventHandler`特性方法的类采用单例方式注入...app.UseSwagger(); app.UseSwaggerUI();}app.UseAuthorization();app.MapControllers();// 2、将上面已经注入IOC容器的类取出、关联处理方法事件总线管理...总结CodeWF.EventBus,一款灵活的事件总线库,实现模块间解耦通信。支持多种.NET项目类型,如WPF、WinForms、ASP.NET Core等。采用简洁设计,轻松实现事件的发布与订阅。

11710

WPF 高速书写 StylusPlugIn 原理 添加 StylusPlugIn 输入迁移的 StylusPlugInCollection 方法使用 StylusPlugIn

如果觉得原理很无聊,就直接关闭本文,因为本文都是理论,不会告诉大家如何做高性能书写 在 WPF 如果想要做高性能的书写,就需要足够快获得用户的触摸输入,而如果直接拿到的是路由的输入就会存在下面的问题...主线程卡住了 主线程没有全力处理触摸笔迹 路由事件本身的耗时 元素多了路由事件就需要经过很多的元素 在用户触摸屏幕的时候,会在 PenThreadWorker.ThreadProc...因为在元素的可视化变化就需要修改属性,请看添加的事件 _element.IsEnabledChanged += _isEnabledChangedEventHandler...如果一个元素使用了 StylusPlugIn 会在触摸的时候最快获得触摸信息,而不需要等待路由事件。...这样就可以让 StylusPlugIn 在触摸被 WPF 影响的事件最少 代码 PenContexts.TargetPlugInCollection ///

65720

WPF 高速书写 StylusPlugIn 原理

如果觉得原理很无聊,就直接关闭本文,因为本文都是理论,不会告诉大家如何做高性能书写 在 WPF 如果想要做高性能的书写,就需要足够快获得用户的触摸输入,而如果直接拿到的是路由的输入就会存在下面的问题...主线程卡住了 主线程没有全力处理触摸笔迹 路由事件本身的耗时 元素多了路由事件就需要经过很多的元素 在用户触摸屏幕的时候,会在 PenThreadWorker.ThreadProc...因为在元素的可视化变化就需要修改属性,请看添加的事件 _element.IsEnabledChanged += _isEnabledChangedEventHandler...如果一个元素使用了 StylusPlugIn 会在触摸的时候最快获得触摸信息,而不需要等待路由事件。...这样就可以让 StylusPlugIn 在触摸被 WPF 影响的事件最少 代码 PenContexts.TargetPlugInCollection ///

51110

一站式WPF--Window(一)

路由事件沿着对象树开始向下传递,方向是一去一回,由PreviewKeyDownKeyDown。...在这个传递过程中,相应的路由事件也被唤起,比如说如果此时焦点在Button上,当传递Button时还会唤起Button的ClickEvent事件等。   ...Input   路由事件WPF处理Input的核心,简略的说就是有一去一回从PreivewKeyDownKeyDown这个过程,PreviewKeyDown的方向是从父子,KeyDown的方向是从子父...它会根据Window消息来生成对应的路由事件,然后把这些信息报告给InputManager。InputManager再根据这些信息找到作用的UIElement,然后唤起路由事件。   ...Milcore(MIL -- Media Integration Layer),托管代码,负责WPF和DirectX之间的通信,它主要由两部分组成:一,Composition Engine。

21130

WPF 高性能笔

如果需要经过路由事件才收到输入,如果有人在路由事件做了很多需要很长事件的代码,那么等待用户的路由事件就会使用很长的时间。 如果需要等待主界面的布局也就是如果主线程卡住了,就需要等待主线程才可以渲染。...在转发的过程,在 WPF 会通过 StylusPlugins 里静态字典,存放用户设置的类。在触摸线程会通过判断触摸点时候在命中对应的元素矩形区判断当前时候命中这个元素。...因为这个过程是从触摸线程拿到的,而且触摸线程在执行 StylusPlugin 后才执行路由事件的代码,使用 StylusPlugin 的速度会比路由事件快很多,加上路由事件需要做命中测试,可能用户会在路由事件做很多事件...而 Stylusplugin 只是从触摸线程拿到,完全不需要等用户在路由事件代码。...如果要做高性能的笔必须要了解 WPF 的触摸和渲染原理,具体请看WPF 渲染原理 和 WPF 触摸到事件 于是下面告诉大家如何做出一个高性能的笔。

72340

WPF 高性能笔

如果需要经过路由事件才收到输入,如果有人在路由事件做了很多需要很长事件的代码,那么等待用户的路由事件就会使用很长的时间。 如果需要等待主界面的布局也就是如果主线程卡住了,就需要等待主线程才可以渲染。...在转发的过程,在 WPF 会通过 StylusPlugins 里静态字典,存放用户设置的类。在触摸线程会通过判断触摸点时候在命中对应的元素矩形区判断当前时候命中这个元素。...因为这个过程是从触摸线程拿到的,而且触摸线程在执行 StylusPlugin 后才执行路由事件的代码,使用 StylusPlugin 的速度会比路由事件快很多,加上路由事件需要做命中测试,可能用户会在路由事件做很多事件...如果要做高性能的笔必须要了解 WPF 的触摸和渲染原理,具体请看WPF 渲染原理 和 WPF 触摸到事件 于是下面告诉大家如何做出一个高性能的笔。...参见:Intercepting Input from the Stylus WPF 渲染原理 WPF 触摸到事件

41430

自定义路由事件

了解了路由事件后,这节来学习一下如何自定义路由事件。...第二个参数是指路由事件的策略,也就是事件传播的形式,有如下三种枚举: RoutingStrategy.Tunnel:隧道式,是指事件从最外层的控件开始路由,直到路由控件自己,就像一条自上往下的隧道,从...第三个参数是指定该路由事件事件处理器是什么类型,第四个参数是指定该路由事件对象的宿主类型,第四个参数跟第一个参数共同用于路由事件对象的内部创建使用:构建hash code,确定路由事件对象唯一性,同依赖属性一致...,值得注意的是,RegisterRoutedEvent的第三个参数我用的是: typeof(EventHandler) 而非: typeof(RoutedEventHandler...) 因为RoutedEventHandler的参数跟我自定义的事件参数不一致,需要使用EventHandler的泛型版指定我的事件参数类型,下面是RoutedEventHandler的声明: 该参数类型是

54120

【翻译】WPF4.5新特性(MSDN的翻译读不太懂)

我很在意WPF的发展,有人说微软不再维护WPF了,无所谓,随他去。...VirtualizingPanel.CacheLengthUnit属性标志这缓存大小的单位 绑定静态属性 WPF支持绑定静态属性, 数据绑定引擎监控静态属性,一旦静态属性的值发生改变,将会触发一个指定的事件...例如: 如果有一个类,取名叫做SomeClass; 它有一个静态属性,取名叫做MyProperty; 在这个类内部可以按如方式定义静态事件: public static event EventHandler...event EventHandler StaticPropertyChanged; 在UI线程访问集合 你可以在一个UI线程中访问和修改UI线程中的集合数据...绑定实现了ICustomTypeProvider接口的类型 WPF支持绑定ICustomTypeProvider的继承类型, 1.可以绑定PropertyType类型的属性,例如,可以把Path属性可以绑定一个自定义类型

1.4K70

大升级!支持CQRS|异步订阅发布-CodeWF.EventBus

Assembly.GetExecutingAssembly()); var app = builder.Build(); // ... // 2、将上面已经注入IOC容器的类取出、关联处理方法事件总线管理...UseEventBus方法会将上一步注入的类通过 IOC 容器获取到实例,将实例的事件处理方法注册事件管理队列中去,待收到事件发布时,会从事件管理队列中查找事件处理方法并调用,达到事件通知的功能。...未使用 IOC 默认的 WPF、Winform、AvaloniaUI、控制台程序默认未引入任何 IOC 容器,这里不用做事件服务注册操作,功能使用上和使用IOC只差自动订阅功能,其他功能一样。...标注了EventHandler特性的方法拥有处理事件的能力,该方法只能有一个事件类型参数;如果方法支持异步,也只支持Task返回值,不能加泛型声明(加了无效)。...总结 CodeWF.EventBus提供了一个小巧灵活的事件总线实现,支持CQRS模式,并适用于各种项目模板,如 Avalonia UI、WPF、WinForms、ASP.NET Core 等。

8010

深入浅出话命令

转自:http://blog.csdn.net/lisenyang/article/details/18312387 WPF为我们准备了完善的命令系统,你可能会问:“有了路由事件为什么还需要命令系统呢?...因为无论是探测命令是否可以执行还是命令送达目标,都会激发命令目标发送路由事件,这些事件会沿着UI元素树向上传递,最终被CommandBinding所捕捉。...第四,CommandBinding一定要设置在命令目标的外围控件上,不然无法捕捉CanExecute和Executed等路由事件。...很显然,这回是命令直接在命令目标上起作用了,而不像RoutedCommand那样现在目标上激发出路由事件等外围控件来捕获到路由事件之后“翻过头来”对命令目标加以处理。...,我们可以在后台代码部分自定基类或者实现接口,最终这些代码会被编译一起。

1.6K40
领券