C# WPF编程-事件

路由事件概要

路由事件是具有更强传播能力的事件,它们可在元素树中向上冒泡和向下隧道传播,并沿着传播路径被事件处理程序处理。

路由事件的三种方式

  1. 与普通.NET事件类似的直接路由事件(direct event)。
  2. 在包含层次中向上传递的冒泡路由事件(bubbling event)。
  3. 在包含层次中向下传递的隧道路由事件(tunneling event)。

定义、注册和封装路由事件

以Button的Click事件为例:

public abstract class ButtonBase: ContentControl,...
{
	// 定义事件
	public static readonly RouteEvent ClickEvent;
	
	// 注册事件
	static ButtonBase()
	{
		ButtonBase.ClickEvent = EventManager.RegisterRouteEvent("Click", 
		RoutingStrategy.Bullle, 
		typeof(RoutedEventHandler), typeof(ButtonBase));
		...
	}
	// 封装事件
	public event RoutedEventHandler Click
	{
		add
		{
			base.AddHandler(ButtonBase.ClickEvent, value);
		}
		remove
		{
			base.RemoveHandler(ButtonBase.ClickEvent, value);
		}
	} 
	...
}
  • 共享路由事件
    可在类之间共享路由事件的定义。
    如:UIElement.MouseUpEvent = Mouse.MouseUpEvent.AddOwner(typeof(UIElement));

  • 引发路由事件
    与所有事件类似,定义类需要在一定情况下引发事件。使用RaiseEvent()方法引发事件。
    如:RouteEventArgs e = new RouteEventArgs(ButtonBase.ClickEvent, this);
    base.RaiseEvent(e);

  • 处理路由事件
    XAML标签中定义:
    < Image Source=“1.png” Name=“img” MouseUp=“img_MouseUp” />
    C# 代码中:
    private void img_MouseUp(object sender, MouseButtonEventArgs e)
    {
    }

  1. 添加事件:

    • 代码中和XAML标记中同样效果:
      img.MouseUp += new MouseButtonEventHandler(img_MouseUp);

    • 更精简的语法,隐式地创建合适的委托对象:
      img.MouseUp += img_MouseUp;

    • 自行调用UIElement.AddHandler()方法直接连接事件:
      img.AddHandler(Image.MouseUpEvent, new MouseButtonEventHandler(img_MouseUp));

  2. 移除事件:

    • 使用-=运算符:
      img.MouseUp -= img_MouseUp;
    • 使用UIElement.RemoveHandler()方法:
      img.RemoveHandler(Image.MouseUpEvent, new MouseButtonEventHandler(img_MouseUp));

RouteEventArgs类:
在这里插入图片描述

附件事件:
所有按键的单击事件都会触发调用DoSomething事件处理函数
在这里插入图片描述
隧道事件:
隧道路由事件易于识别,它们都以Preview开头。WPF通常成对地定义冒泡路由事件和隧道路由事件。如冒泡事件MouseUp和隧道事件PrevieMouseUp。

WPF事件

WPF最重要的5类事件:

  1. **生命周期事件:**在元素被初始化、加载或卸载时发生这些事件。
  2. **鼠标事件:**操作鼠标时发生的事件。
  3. **键盘事件:**操作键盘时发生的事件。
  4. **手写笔事件:**操作手写笔时发生的事件。
  5. 多点触控事件: 操作触摸屏时发生的事件。

生命周期事件

在这里插入图片描述
在这里插入图片描述

鼠标事件

获取鼠标Move事件的鼠标坐标信息:

       private void Window_MouseMove(object sender, MouseEventArgs e)
       {
           Point pt = e.GetPosition(this);

           Console.WriteLine($"Window_MouseMove {pt.X}, {pt.Y}");
       }

在这里插入图片描述

 private void Window_MouseUp(object sender, MouseButtonEventArgs e)
 {
     Console.WriteLine("Window_MouseUp");
 }

 private void Window_MouseDown(object sender, MouseButtonEventArgs e)
 {
     Console.WriteLine("Window_MouseDown");
 }

 private void Window_MouseEnter(object sender, MouseEventArgs e)
 {
     Console.WriteLine("Window_MouseEnter");
 
 }

 private void Window_MouseLeave(object sender, MouseEventArgs e)
 {
     Console.WriteLine("Window_MouseLeave");
 }

 private void Window_MouseDoubleClick(object sender, MouseButtonEventArgs e)
 {
     Console.WriteLine("Window_MouseDoubleClick");
 }

 private void Window_MouseMove(object sender, MouseEventArgs e)
 {
     Point pt = e.GetPosition(this);

     Console.WriteLine($"Window_MouseMove {pt.X}, {pt.Y}");
 }
  • 鼠标捕获
    在这里插入图片描述

  • 鼠标拖放
    在这里插入图片描述

键盘事件

在这里插入图片描述

<Grid Button.Click="Grid_Click" KeyDown="Grid_KeyDown">
    <StackPanel>
        <Button Name="btn1" Width="20" Height="30" Margin="10" Click="btn1_Click">OK</Button>
        <TextBox TextInput="TextBox_TextInput"></TextBox>
    </StackPanel>
</Grid>

 private void Grid_KeyDown(object sender, KeyEventArgs e)
 {
     Console.WriteLine($"{e.Key.ToString()}");
 }

 private void TextBox_TextInput(object sender, TextCompositionEventArgs e)
 {
     Console.WriteLine($"{e.Text}");
 }

KeyboardDevice属性提供的方法:
在这里插入图片描述

多点触控输入

在这里插入图片描述

原始触控

在这里插入图片描述

相关推荐

  1. python版 html正文提取(CEPF)

    2024-03-24 10:00:04       6 阅读
  2. 事件相机角点检测:从原理到演示编程

    2024-03-24 10:00:04       40 阅读
  3. 《Linux C编程实战》笔记:信号应用于事件通知

    2024-03-24 10:00:04       33 阅读
  4. 深入理解C#中的事件驱动编程

    2024-03-24 10:00:04       28 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-24 10:00:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-24 10:00:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-24 10:00:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-24 10:00:04       20 阅读

热门阅读

  1. 看PDF时点击书签页面变小的解决方法

    2024-03-24 10:00:04       18 阅读
  2. golang 轻量数据库推荐

    2024-03-24 10:00:04       17 阅读
  3. 独孤思维:流量暴涨,却惨遭违规

    2024-03-24 10:00:04       20 阅读
  4. C语言例3-37:赋值类型转换的例子

    2024-03-24 10:00:04       17 阅读
  5. 蓝桥杯刷题--python-28-并查集

    2024-03-24 10:00:04       20 阅读
  6. Golang-web开发好用的依赖库

    2024-03-24 10:00:04       20 阅读
  7. connect 库的介绍、使用及源码分析

    2024-03-24 10:00:04       20 阅读
  8. 模板 前缀和 NC

    2024-03-24 10:00:04       19 阅读
  9. 基于单片机的小区安防控制系统设计

    2024-03-24 10:00:04       17 阅读