路由事件:

1.路由事件一般使用的三种策略如下所示:
A.Bubble(冒泡模式):事件从自己激发一直传递到根元素;
B.Direct(直接模式):只有事件源才有机会相应事件(和传统事件一样);
C.Tunnel(隧道模式):事件从根元素传递到自己。
一般情况,WPF提供的输入事件都是以冒泡/隧道对实现的。隧道事件常常被称为Preview事件。

2.路由事件的注册方式
通过EventManager的RegisterRoutedEvent()函数向事件系统注册路由事件;
public static RoutedEvent RegisterRoutedEvent(string name, RoutingStrategy routingStrategy,
Type handlerType, Type ownerType);
参数解释:
第一个参数name表示事件在WPF事件系统中的名称;
第二个参数routingStrategy则标明了路由事件的路由原则;
第三个参数handlerType用来标明事件处理函数的类型;
第四个参数ownerType则用来标明拥有该路由事件的类型。
例如:
Control类注册MouseDoubleClick事件的代码如下:
public static readonly RoutedEvent MouseDoubleClickEvent =
EventManager.RegisterRoutedEvent("MouseDoubleClick", RoutingStrategy.Direct,
typeof(MouseButtonEventHandler), typeof(Control));

EventManager类还提供了一个RegisterClassHandler()函数,以为特定路由事件注册类处理程序。
该函数的原型如下:
public static void RegisterClassHandler(Type classType, RoutedEvent routedEvent,
Delegate handler, bool handledEventsToo);
第一个参数用来指定注册类处理函数的类型;
第二个参数则用来指定类处理函数所需要侦听的事件;
第三个参数则指明了类处理函数;
第四个参数设置为true则允许类处理函数能够处理被标记为已处理的路由事件。

3.创建自定义路由事件的步骤:
(1)声明并注册路由事件;
(2)为路由事件添加CLR事件包装;
(3)创建可以激发路由事件的方法。

<Window x:Class="WPFDemos.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid x:Name="GridRoot" >
<Grid x:Name="gridA" Margin="10" Background="Blue">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Canvas x:Name="canvasLeft" Grid.Column="0" Background="Red" Margin="10">
<Button x:Name="buttonLeft" Width="40" Height="100" Margin="30,135,357,76" Content="left">
<Button.RenderTransform>
<!--旋转度数-->
<RotateTransform Angle="270"/>
</Button.RenderTransform>
</Button>
<Canvas x:Name="canvasRight" Grid.Column="1" Background="Yellow" Margin="10">
<Button x:Name="buttonRight" HorizontalAlignment="Center" Content="right" Width="40" Height="100" Margin="138,105,325,106" >
<Button.LayoutTransform >
<RotateTransform Angle="90"/>
</Button.LayoutTransform>
</Button>
<Button Content="test" Height="23" HorizontalAlignment="Left" Margin="80,217,0,0" Name="buttontest" VerticalAlignment="Top" Width="75" >
<Button.RenderTransform>
<!--旋转度数-->
<RotateTransform Angle="13"/>
</Button.RenderTransform>
</Button>
</Canvas>
</Canvas>
</Grid>
</Grid>
</Window>
using System.Windows;
using System.Windows.Controls; namespace WPFDemos
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent(); //当同一个UI中存在多个相同控件的相同事件时可考虑使用,例如计算器中的Button事件
this.GridRoot.AddHandler(Button.ClickEvent, new RoutedEventHandler(this.ButtonClicked));
} private void ButtonClicked(object sender,RoutedEventArgs e)
{
MessageBox.Show("Test==" +(e.OriginalSource as FrameworkElement).Name);
}
}
}

WPF Demo511 控件共用事件的更多相关文章

  1. WPF Label控件在数据绑定Content属性变化触发TargetUpdated事件简单实现类似TextChanged 事件效果

    原文:WPF Label控件在数据绑定Content属性变化触发TargetUpdated事件简单实现类似TextChanged 事件效果   本以为Label也有TextChanged 事件,但在使 ...

  2. WPF常用控件应用demo

    WPF常用控件应用demo 一.Demo 1.Demo截图如下: 2.demo实现过程 总体布局:因放大缩小窗体,控件很根据空间是否足够改变布局,故用WrapPanel布局. <ScrollVi ...

  3. WPF 分页控件 WPF 多线程 BackgroundWorker

    WPF 分页控件 WPF 多线程 BackgroundWorker 大家好,好久没有发表一篇像样的博客了,最近的开发实在头疼,很多东西无从下口,需求没完没了,更要命的是公司的开发从来不走正规流程啊, ...

  4. 两款不同应用场景的Wpf分页控件

    简介 今天给大家分享两个Wpf分页控件,本篇博客主要介绍一些实现思路和使用方法,具体实现和应用代码请参考文末的Demo链接 废话不多说,先看一下效果~ (两款控件显示效果是一样的) 实现思路 一款控件 ...

  5. 正则表达式——WPF输入控件TextBox 限定输入特定字符

    概念: 正则表达式是对字符串操作的一种逻辑公式, 就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”, 这个“规则字符串”用来表达对字符串的一种过滤逻辑. 目的: 给定一个正 ...

  6. WPF DataGrid 控件的运用

    WPF DataGrid 控件的运用 运行环境:Window7 64bit,.NetFramework4.61,C# 6.0: 编者:乌龙哈里 2017-02-23 参考: King Cobra 博客 ...

  7. WPF实现控件拖动

    原文:WPF实现控件拖动 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lordwish/article/details/51823637 实现控件 ...

  8. WPF ListView控件设置奇偶行背景色交替变换以及ListViewItem鼠标悬停动画

    原文:WPF ListView控件设置奇偶行背景色交替变换以及ListViewItem鼠标悬停动画 利用WPF的ListView控件实现类似于Winform中DataGrid行背景色交替变换的效果,同 ...

  9. WPF滑块控件(Slider)的自定义样式

    前言 每次开发滑块控件的样式都要花很久去读样式代码,感觉有点记不牢,所以特此备忘. 自定义滑块样式 首先创建项目,添加Slider控件. 然后获取Slider的Window样式,如下图操作. 然后弹出 ...

随机推荐

  1. Gauss error function

    0. error function erf(x)=1π∫−xxe−t2dt" role="presentation">erf(x)=1π−−√∫x−xe−t2dte ...

  2. 【转载】 Pytorch(0)降低学习率torch.optim.lr_scheduler.ReduceLROnPlateau类

    原文地址: https://blog.csdn.net/weixin_40100431/article/details/84311430 ------------------------------- ...

  3. Ideal部署web工程

  4. php基础-7

    php json数据的读取和转换 将数组转化为json <?php $arr = array('h'=>"hello", "w"=>" ...

  5. Python学习之---Python中的内置函数(方法)(更新中。。。)

    add(item)   #将item添加到s中,如果item已经在s中,则无任何效果 break        #退出循环,不会再运行循环中余下的代码 bool()     #将参数转换为布尔型 by ...

  6. canvas的认识,时钟的设置

    canvas的三要素:ID标识,width宽度,height高度,他是行元素 IE9才支持canvas,canvas是一个透明的画板,要用js去画 绘制一个圆 线性渐变颜色 径向渐变 图片的绘制: 视 ...

  7. Js 向表单中添加多个元素

    @{ ViewBag.title = "地图导航"; } @model YT.XWAJ.Public.Application.MapNavigation.Dto.MapNaviga ...

  8. 每天进步一点点-Java IO操作-Java Serializable(对象序列化)的理解和总结

    往硬盘文件里写数据 序列化:序列化是将对象转换为容易传输的格式的过程.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象.在另一端,反序列化将从该流重 ...

  9. 改变codeblocks里面各种注释的颜色。

    ->Setting->Editor->Syntax highlighting->“Comment(normal)” /* 改变块注释颜色 */"Comment lin ...

  10. css重难点笔记

    只有定位(static除外)的盒子才有z-index,即对静态定位,文档流和浮动设置z-index,都是无效的. 一个盒子如果未给宽度,那么被浮动,绝对定位,display:inline-block之 ...