WPF学习笔记6. RoutedEvent
2010-10-11 16:14:30 来源:本站整理核心提示:handledEventsToo: 如果为 true,则将按以下方式注册处理程序:即使路由事件在其事件数据中标记为已处理,WPF学习笔记6. RoutedEvent(2),也会调用该处理程序;如果为 false,则使用默认条件注册处理程序,不要想当然认为该示例表示只有 Button 类型的子元素才会触发 Click 附
handledEventsToo: 如果为 true,则将按以下方式注册处理程序:即使路由事件在其事件数据中标记为已处理,也会调用该处理程序;如果为 false,则使用默认条件注册处理程序,即当路由事件被标记为已处理时,将不调用处理程序。
通常情况下,WPF 控件会在管道事件的名称前添加 Preview 前缀。
<Window x:Class="Learn.WPF.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1"> <Grid> <Border PreviewMouseRightButtonDown="MouseRightButtonDown"> <StackPanel PreviewMouseRightButtonDown="MouseRightButtonDown"> <Button PreviewMouseRightButtonDown="MouseRightButtonDown">Test</Button> </StackPanel> </Border> </Grid> </Window>
这回的输出结果正好跟前面的演示反过来,依次是 "Border"、"StackPanel"、"Button"。如果继续保留事件终止代码,那么 Button.PreviewMouseRightButtonDown 就不再被触发。
附加事件
和附加属性类似,WPF 允许我们在一个没有定义事件的元素上处理经管道或冒泡传递的路由事件。
Window1.xaml
<Window x:Class="Learn.WPF.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1"> <Grid> <StackPanel Button.Click="Click"> <Button>Test</Button> </StackPanel> </Grid> </Window>
Window1.xaml.cs
public partial class Window1 : Window { public Window1() { InitializeComponent(); } private void Click(object sender, RoutedEventArgs e) { MessageBox.Show(e.Source.ToString()); } }
输出:
System.Windows.Controls.Button:Test
虽然 StackPanel 没有 Click 事件,但我们依然捕获了 Button 的点击事件,还有就是注意附加属性的写法。不要想当然认为该示例表示只有 Button 类型的子元素才会触发 Click 附加事件。
<Window x:Class="Learn.WPF.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1"> <Grid> <StackPanel Button.Click="Click"> <Button>Test</Button> <CheckBox>Check</CheckBox> </StackPanel> </Grid> </Window>
很遗憾地告诉你,CheckBox 一样触发了 Click 附加事件。
[]
更多精彩
赞助商链接