路由事件:

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. 如何在Ubuntu/Linux内使用 zip 压缩隐藏文件?

    假设你的当前目录结构为: A文件--B文件夹--C文件等 | | D文件夹-E文件 | | 等等文件(含隐藏) 那么在使用zip命令时加上 -r 即可包含整个目录结构和隐藏文件: zip -r B.z ...

  2. 【leetcode】53-MaximumSubarray

    problem MaximumSubarray code class Solution { public: int maxSubArray(vector<int>& nums) { ...

  3. [LeetCode&Python] Problem 706. Design HashMap

    Design a HashMap without using any built-in hash table libraries. To be specific, your design should ...

  4. HPU组队赛L(没有标题。。)(贪心)

    时间限制 1 Second  内存限制  512 Mb 题目描述 给个字符串s和整数k.(字符串中只有0-9) 问至少修改字符串中的几位才可以让字符串的各个位之和大于等于k. 输入 第一行一个整数T表 ...

  5. HDU 3635:Dragon Balls(并查集)

    Dragon Balls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot ...

  6. PTA——简单计算器

    PTA 7-20 简单计算器 #include<stdio.h> int main() { int a,b; char c; scanf("%d",&a); w ...

  7. Blender 曲线操作

    Curve (Bézier Versus NURBS)https://en.wikibooks.org/wiki/Blender_3D:_Noob_to_Pro/Curve_and_Path_Mode ...

  8. nginx 优化(突破十万并发)

    一般来说nginx配置文件中对优化比较有作用的为以下几项: worker_processes 8; nginx进程数,建议按照cpu数目来指定,一般为它的倍数. worker_cpu_affinity ...

  9. MySQL之高可用MHA部署

    先说一下大概原理 虚拟机A  ip为10.0.3.92           作为master 虚拟机B  ip为10.0.3.102  作为slave1 虚拟机C  ip为10.0.3.103  作为 ...

  10. AI三巨头获2018年图灵奖!

    ACM 宣布,2018 年图灵奖获得者是号称深度学习三巨头的 Yoshua Bengio, Yann LeCun 和 Geoffrey Hinton,得奖理由是:他们在概念和工程上取得的巨大突破,使得 ...