C# WPF编程-路由事件
- 路由事件概要
- 路由事件的三种方式
- WPF事件
- WPF最重要的5类事件:
- 生命周期事件
- 鼠标事件
- 键盘事件
- 多点触控输入
- 原始触控
路由事件概要
路由事件是具有更强传播能力的事件,它们可在元素树中向上冒泡和向下隧道传播,并沿着传播路径被事件处理程序处理。
路由事件的三种方式
- 与普通.NET事件类似的直接路由事件(direct event)。
- 在包含层次中向上传递的冒泡路由事件(bubbling event)。
- 在包含层次中向下传递的隧道路由事件(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)
{
}
-
添加事件:
-
代码中和XAML标记中同样效果:
img.MouseUp += new MouseButtonEventHandler(img_MouseUp); -
更精简的语法,隐式地创建合适的委托对象:
img.MouseUp += img_MouseUp; -
自行调用UIElement.AddHandler()方法直接连接事件:
img.AddHandler(Image.MouseUpEvent, new MouseButtonEventHandler(img_MouseUp));
-
-
移除事件:
- 使用-=运算符:
img.MouseUp -= img_MouseUp; - 使用UIElement.RemoveHandler()方法:
img.RemoveHandler(Image.MouseUpEvent, new MouseButtonEventHandler(img_MouseUp));
- 使用-=运算符:
RouteEventArgs类:
附件事件:
所有按键的单击事件都会触发调用DoSomething事件处理函数
隧道事件:
隧道路由事件易于识别,它们都以Preview开头。WPF通常成对地定义冒泡路由事件和隧道路由事件。如冒泡事件MouseUp和隧道事件PrevieMouseUp。
WPF事件
WPF最重要的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属性提供的方法: