路由事件:

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. LINUX添加磁盘

    博客网站原因,图片不能很好插入,望谅解 第一步:设置加载硬盘.由于是虚拟硬盘大小,不会一开始直接占用全部空间,使用多少占用多少,为了避免后期磁盘满前期设计大容量 第二步加载查看磁盘: 再执行fdisk ...

  2. help2man: can't get `--help' info from automake-1.15 Try `--no-discard-stderr' if option outputs to stderr Makefile:3687: recipe for target 'doc/automake-1.15.1' failed

    /********************************************************************** * help2man: can't get `--hel ...

  3. char *s 和 char s[] 的区别

    最近的项目中有不少c的程序,在与项目新成员的交流中发现,普遍对于char *s1 和 char s2[] 认识有误区(认为无区别),导致有时出现“难以理解”的错误.一时也不能说得很明白,网上也搜了一下 ...

  4. 获取Linux服务器基本信息的shell脚本

    测试运行环境: SLES12SP2 #!/bin/bash #系统名称:os_type=$(uname -o | awk '{print " | "$0}') #系统位数:32/6 ...

  5. c日志宏

    仅供参考,不推荐 #ifdef _DEBUG #define LOGDEBUG(format, ...)\ {\ FILE *fp = fopen("nccli.log", &qu ...

  6. xdoj新生现场赛1269——带有限制条件的bfs 寻找最短路径

    bfss是解决最短路径的强大武器 (尝试dfs寻找最短路径 -(7*7)就会爆炸) 例题1  ccf 201604-4  游戏 问题描述 小明在玩一个电脑游戏,游戏在一个n×m的方格图上进行,小明控制 ...

  7. XXS level5

    (1)用第四关的方法尝试,发现不行,查看页面源代码,发现on中间有了下划线 (2)查看PHP源代码 <?php ini_set("display_errors", 0); $ ...

  8. 再回首 基本数据类型和 if语句

    一 变量:(使用变量是不能加引号,要不就变成字符串了) 变量的命名规则: 1.数字,字母,下划线组成. 2.变量不能是数字开头 3.区分大小写 4.不要使用中文或者拼音 5.要有相应的意义 6.不能使 ...

  9. PTA——类型转换

    PTA习题 7-6 厘米换算英尺英寸 (15 分) #include<stdio.h> int main(){ int a; int b,c; scanf("%d",& ...

  10. hdu2461 Rectangles 线段树--扫描线

    You are developing a software for painting rectangles on the screen. The software supports drawing s ...