精华内容
下载资源
问答
  • WPF的路由事件

    2021-05-09 15:05:06
    WPF的路由事件是Winndows消息机制重要概念之一也是最常见的人机交互手段之一,XAML帮助应用管理用户输入,执行不同的行为。事件常常被用于控制更改通知操作。 事件的基础语法: XAML: C#: 事件系统在WPF中被升级...

    开发工具与关键技术:MVC
    作者:zhh
    撰写时间:2021.5.8

    WPF的路由事件是Winndows消息机制重要概念之一也是最常见的人机交互手段之一,XAML帮助应用管理用户输入,执行不同的行为。事件常常被用于控制更改通知操作。
    事件的基础语法:
    XAML:
    在这里插入图片描述
    C#:
    在这里插入图片描述
    事件系统在WPF中被升级进化称为路由事件(Routed Event),并在其基础上衍生出命
    令传递机制。这些机制很大程度上减少了对程序员的束缚,让程序的设计和实现更加灵
    活,模块之间的耦合度也进一步降低。
    功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理
    程序的事件。
    实现定义:路由事件是一个 CLR 事件,可以由 RoutedEvent 类的实例提供支持并由 Windows
    Presentation Foundation (WPF) 事件系统来处理。
    中断事件路由 :

        所有的路由事件都共享一个公共的事件数据基类 RoutedEventArgs。 RoutedEventArgs 定义了一个采用
    

    布尔值的 Handled 属性。 Handled 属性的目的在于,允许路由中的任何事件处理程序通过将 Handled 的值设
    置为 true 来将路由事件标记为“已处理”。
    冒泡事件是WPF路由事件中最为常见,它表示事件从源元素扩散(传播)到可视树,直到它被处理或到达根元素。这样您就可以针对源元素的上方层级对象处理事件。例如,您可向嵌入的 Grid 元素附加一个Button.Click 处理程序,而不是直接将其附加到按钮本身。气泡事件有指示其操作的名称
    隧道事件采用另一种方式,从根元素开始,向下遍历元素树,直到被处理或到达事件的源元素。这样上游元素就可以在事件到达源元素之前先行截取并进行处理。根据命名惯例,隧道事件带有前缀 Preview。路由事件通常遵循以下两个路由策略之一:浮升和隧道。 此示例重点介绍浮升事件,并使用ButtonBase.Click事件可显示路由的工作原理。下面的示例创建两个Button控制,并使用XAML特性语法将事件处理程序附加到公用父元素,它在此示例中为StackPanel。 而不是将单个事件处理程序附加每个Button子元素,该示例使用特性语法将附加到的事件处理程序StackPanel父元素。 此事件处理模式展示了如何使用事件路由技术来减少附加处理程序的元素数。 每个的所有浮升事件Button通过父元素路由。请注意,在父StackPanel元素中,Click指定为该属性进行部分限定的命名的事件名称Button类。 Button类是ButtonBase派生的类具有Click事件在其成员列表中的。 如果要处理的事件不在附加路由事件处理程序的元素的成员列表中,则有必要使用这种部分限定技术来附加事件处理程序。

    展开全文
  • WPF的路由事件、冒泡事件 开发工具与关键技术:Visual Studio+WPF 作者:奉平花 撰写时间:2019年04月14日 1:什么是路由事件 WPF中的事件为路由事件,所谓路由事件,MSDN定义如下: 功能定义:路由事件是一种可以...

    WPF的路由事件、冒泡事件


    开发工具与关键技术:Visual Studio+WPF
    作者:奉平花
    撰写时间:2019年04月14日


    1:什么是路由事件
    WPF中的事件为路由事件,所谓路由事件,MSDN定义如下:
    功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件。
    实现定义:路由事件是一个 CLR 事件,可以由 RoutedEvent 类的实例提供支持并由 Windows Presentation Foundation (WPF) 事件系统来处理。
    但这两类定义都比较抽象,我们来看更具体的定义:
    在这里插入图片描述

    TextBlock -->StackPanel–>Border —>…
    一、路由事件一:逻辑树和可视树
    什么是逻辑树
    逻辑树就是描述WPF界面元素的实际构成,它是由程序在XAML中所有的UI元素组成。最显著的特点就是由布局控件、或者其他常用的控件组成。
    从上面的代码中可以看出,Window、Grid、StackPanel、TextBox其实就是XAML界面的逻辑树。
    什么是可视树
    可视树是由界面上可见的元素构成的,这些元素主要是由从Visual或者Visual3D类中派生出来的类。
    上面代码中的Window、Grid、StackPanel、TextBox它们本身就包含一些由Visual或者Visual3D类派生出的一些可视树的元素来组成的。
    二、逻辑树和可视树的遍历
    逻辑树遍历使用LogicalTreeHelper类。
    可视树遍历使用VisualTreeHelper类。
    演示遍历逻辑树和可视树
    1、 XAML界面左边显示逻辑树,右边显示可视树,代码如下
    在这里插入图片描述
    2.中断事件路由 所有的路由事件都共享一个公共的事件数据基类 RoutedEventArgs。 RoutedEventArgs 定义了一个采用布尔值的 Handled 属性。 Handled 属性的目的在于,允许路由中的任何事件处理程序通过将 Handled 的值设置为 true 来将路由事件标记为“已处理”。
    在这里插入图片描述
    在本文一开始的例子中,如果我们将MouseUP,改为PreviewMouseUP,效果会如何呢。
    区别:
    冒泡事件:在YesTB上点击,首先弹出“button”,再弹出“panel”。
    预览事件(隧道事件)事件:在YesTB上点击,首先弹出“panel”,再弹出“button”。
    看到了这点区别,那么我们加入e.Handled=true的时机也要不同。首先,
    冒泡事件例子中:e.Handled=true加在YesTB_PreviewMouseUp中,加入后,点击YesTB,将只弹出“button”。
    预览事件(隧道事件)例子中:e.Handled=true家在StackPanel_PreviewMouseUp中,加入后,点击YesTB,将只弹出“panel”。

    展开全文
  • WPF的路由事件、冒泡事件、隧道事件(预览事件) 原文:WPF的路由事件、冒泡事件、隧道事件(预览事件)本文摘要: 1:什么是路由事件; 2:中断事件路由; 3:自定义路由事件; 4:为什么需要...
    原文:WPF的路由事件、冒泡事件、隧道事件(预览事件)

    本文摘要:

    1:什么是路由事件;

    2:中断事件路由;

    3:自定义路由事件;

    4:为什么需要自定义路由事件;

    5:什么是冒泡事件和预览事件(隧道事件);

    1:什么是路由事件

        WPF中的事件为路由事件,所谓路由事件,MSDN定义如下:

        功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件。

        实现定义:路由事件是一个 CLR 事件,可以由 RoutedEvent 类的实例提供支持并由 Windows Presentation Foundation (WPF) 事件系统来处理。

        但这两类定义都比较抽象,我们来看更具体的定义:

           <Border Height="50" Width="250" BorderBrush="Gray" BorderThickness="1" >
                <StackPanel Background="LightGray" Orientation="Horizontal" MouseUp="StackPanel_MouseUp">
                    <TextBlock Name="YesTB" Width="50"  MouseUp="YesTB_MouseUp" Background="Blue" >Yes</TextBlock>
                </StackPanel>
            </Border>

        在这个例子中,事件的事件路由为:

    TextBlock -->StackPanel-->Border —>...

    2:中断事件路由      所有的路由事件都共享一个公共的事件数据基类 RoutedEventArgsRoutedEventArgs 定义了一个采用布尔值的 Handled 属性。 Handled 属性的目的在于,允许路由中的任何事件处理程序通过将 Handled 的值设置为 true 来将路由事件标记为“已处理”。

            private void StackPanel_MouseUp(object sender, MouseButtonEventArgs e)
            {
                MessageBox.Show("Panel");
            }
    
            private void YesTB_MouseUp(object sender, MouseButtonEventArgs e)
            {
                MessageBox.Show("button");
                e.Handled = true;
            }

        在上面的例子中,将不再触发StackPanel_MouseUp事件。

    3:自定义路由事件

          如下面的示例所示,首先使用 RegisterRoutedEvent 方法注册一个 RoutedEvent。按照约定,RoutedEvent 静态字段名称应当以后缀 Event 结束。在本示例中,事件的名称是 Tap,事件的路由策略是 Bubble。在注册调用之后,可以为该事件提供添加和移除公共语言运行时 (CLR) 事件访问器。

          请注意,尽管该事件在本特定示例中是通过 OnTap 虚方法引发的,但您引发事件的方式或者事件响应更改的方式取决于您的需要。

          还要注意,本示例主要实现 Button 的一整个子类;该子类是作为单独的程序集构建的,之后将在单独的可扩展应用程序标记语言 (XAML) 页上实例化为一个自定义类。这是为了说明这样一个概念:创建子类的控件可以插入到由其他控件组成的树中,在这种情况下,这些控件上的自定义事件具有与任何固有的 Windows Presentation Foundation (WPF) 元素完全相同的事件路由功能。

    public class MyButtonSimple: Button
    {
        // Create a custom routed event by first registering a RoutedEventID
        // This event uses the bubbling routing strategy
        public static readonly RoutedEvent TapEvent = EventManager.RegisterRoutedEvent(
            "Tap", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyButtonSimple));
    
        // Provide CLR accessors for the event
        public event RoutedEventHandler Tap
        {
                add { AddHandler(TapEvent, value); } 
                remove { RemoveHandler(TapEvent, value); }
        }
    
        // This method raises the Tap event
        void RaiseTapEvent()
        {
                RoutedEventArgs newEventArgs = new RoutedEventArgs(MyButtonSimple.TapEvent);
                RaiseEvent(newEventArgs);
        }
        // For demonstration purposes we raise the event when the MyButtonSimple is clicked
        protected override void OnClick()
        {
            RaiseTapEvent();
        }
    
    }
    <Window  
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:custom="clr-namespace:SDKSample;assembly=SDKSampleLibrary"
        x:Class="SDKSample.RoutedEventCustomApp"
    
        >
        <Window.Resources>
          <Style TargetType="{x:Type custom:MyButtonSimple}">
            <Setter Property="Height" Value="20"/>
            <Setter Property="Width" Value="250"/>
            <Setter Property="HorizontalAlignment" Value="Left"/>
            <Setter Property="Background" Value="#808080"/>
          </Style>
        </Window.Resources>
        <StackPanel Background="LightGray">
            <custom:MyButtonSimple Name="mybtnsimple" Tap="TapHandler">Click to see Tap custom event work</custom:MyButtonSimple>
        </StackPanel>
    </Window>

    4:为什么需要自定义路由事件

          一直到目前看来,我们都不太需要自定义的路由事件。但是,在我们创建自定义控制的时候,创建一些和业务相关的路由事件,就显得很有必要。

          如,创建一个在线考试中的题型展示控件,可以为该控件设计一个自定义事件,为“提交”。这样一来,这个题型控件不仅仅只有一些通用事件,还可以看上去更“业务”。

    5:什么是冒泡事件和预览事件(隧道事件)

     路由事件实际上分两类:冒泡事件和预览事件(隧道事件)。上文中的例子就是冒泡事件。

         冒泡事件是WPF路由事件中最为常见,它表示事件从源元素扩散(传播)到可视树,直到它被处理或到达根元素。这样您就可以针对源元素的上方层级对象处理事件。例如,您可向嵌入的 Grid 元素附加一个 Button.Click 处理程序,而不是直接将其附加到按钮本身。气泡事件有指示其操作的名称(例如,MouseDown)。

         隧道事件采用另一种方式,从根元素开始,向下遍历元素树,直到被处理或到达事件的源元素。这样上游元素就可以在事件到达源元素之前先行截取并进行处理。根据命名惯例,隧道事件带有前缀 Preview(例如 PreviewMouseDown)。

         在本文一开始的例子中,如果我们将MouseUP,改为PreviewMouseUP,效果会如何呢。

    区别:

         冒泡事件:在YesTB上点击,首先弹出“button”,再弹出“panel”。

         预览事件(隧道事件)事件:在YesTB上点击,首先弹出“panel”,再弹出“button”。

         看到了这点区别,那么我们加入e.Handled=true的时机也要不同。首先,

         冒泡事件例子中:e.Handled=true加在YesTB_PreviewMouseUp中,加入后,点击YesTB,将只弹出“button”。

         预览事件(隧道事件)例子中:e.Handled=true家在StackPanel_PreviewMouseUp中,加入后,点击YesTB,将只弹出“panel”。

    posted on 2018-11-11 13:02 NET未来之路 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/lonelyxmas/p/9941797.html

    展开全文
  • WPF的路由事件.rar

    2019-07-08 15:46:15
    WPF中实现两种路由事件的具体代码以及详细注释,包括冒泡路由事件和隧道路由事件
  • 1.1路由事件 Events称为事件,是Windows消息机制中重要概念之一,也是最常见人机交互手段之一。XAML和其他开发语言类似,具有事件机能,帮助应用管理用户输入,执行不同行为。根据用户不同操作,执行不同...

    一、完成登录窗体事件处理

    1.1路由事件
    Events称为事件,是Windows消息机制中的重要概念之一,也是最常见的人机交互手段之一。XAML和其他开发语言类似,具有事件机能,帮助应用管理用户输入,执行不同的行为。根据用户不同的操作,执行不同的业务逻辑代码。

    展开全文
  • WPF的路由事件概述

    2009-06-19 15:04:00
    先决条件 本主题假设您对如下内容有基本了解:公共语言运行时 (CLR)、面向对象编程以及如何用树概念来说明 WPF...可以从功能或实现角度来考虑路由事件。此处对这两种定义均进行了说明,因为用户当中有...
  • WPF 自定义路由事件

    2018-05-29 00:55:00
    原文:WPF 自定义路由事件WPF的路由事件 as U know,和以前Windows消息事件区别不再多讲,这篇博文中,将首先回顾下WPF内置的路由事件的用法,然后在此基础上自定义一个路由事件。 1.WPF内置路由事件 WPF中的...
  • WPF的路由事件 as U know,和以前Windows消息事件区别不再多讲,这篇博文中,将首先回顾下WPF内置的路由事件的用法,然后在此基础上自定义一个路由事件。 1.WPF内置路由事件 WPF中的大多数事件都是路由事件,WPF...
  • WPF自定义路由事件

    千次阅读 2014-09-01 21:50:27
    本文通过实例演示WPF自定义路由事件的使用,进而探讨了路由事件与普通CLR事件区别(注:“普通CLR事件”这个说法可能不太专业,但是,我暂时也找不到什么更好称呼,就这么着吧,呵呵。)(扩展阅读:例说...
  • WPF 路由事件

    2015-06-25 13:20:00
    每每谈到WPF的路由事件,我总是比较模糊的,因为我一般很少用,因为一般是用Binding来满足数据驱动界面的要求,要么就是通过路由命令来执行我想要做的方法,路由事件确实用得少,那么路由事件跟一般的事件的区别在...
  • WPF的路由事件 as U know,和以前Windows消息事件区别不再多讲,这篇博文中,将首先回顾下WPF内置的路由事件的用法,然后在此基础上自定义一个路由事件。 1.WPF内置路由事件 WPF中的大多数事件都是路由事件,...
  • WPF 自定义路由事件简单实现 一、首先创建一个WPF项目,在项目中添加一个用户控件; 用户控件xaml代码: <UserControl x:Class="WpfApp19.MyUserControl" xmlns=...
  • WPF路由事件

    2018-10-15 20:15:00
    路由:起点与终点间有若干个中转站,从起点出发经过每个中转站时要做出选择,最终以正确(如:最短或最快)路径到达终点。 Windows操作系统:一种消息驱动操作系统,程序是由消息驱动,程序运行也需要把自己...
  • WPF 隧道路由事件

    2013-09-10 21:10:00
    阅读本文前,请先了解 冒泡路由事件:http://www.cnblogs.com/andrew-blog/p/WPF_BubbledEvent.html 隧道路由事件的工作方式和冒泡路由事件相同,但方向相反。例如,如果 MouseUp 事件是一个隧道路由事件(实际...
  • wpf 理解路由事件

    2015-07-18 22:30:54
    路由允许事件在某个元素是引发,可以编写好代码 ...第一个引发这个事件对象,第二个是路由事件的参数,有一个重要属性。Souce是对象事件,当事件 origiacl Source指向树中更深 层次, e.Handle为true事件

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 660
精华内容 264
关键字:

wpf的路由事件