[Silverlight]奇技银巧系列-5 捕获路由事件
Silverlight奇技銀巧系列:
所有該系列中的文章只為介紹一些Silverlight中或隱藏在Silverlight .NET framework鮮為人知的知識(shí)和技巧。這些文章并非教程,也是不是什么技術(shù)指導(dǎo),您只需對(duì)文章介紹的內(nèi)容保有印象。這些知識(shí)和技巧也許會(huì)在不經(jīng)意間綻放銀色光芒。
Silverlight中事件的處理方式有時(shí)會(huì)令人費(fèi)解。其實(shí)Silverlight中有兩種事件,它們分別是“直接事件”和“路由事件”。
所謂“直接事件”其實(shí)就是我們?cè)趙inform,vb6,mfc等等中使用的事件模型,相信大家已經(jīng)很熟悉了,MediaElement的MediaEnded事件就是這種類型的事件。
而“路由事件”是從WPF發(fā)展到Silverlight中的。路由事件沿著可視化樹向上冒泡,它總是從嵌套中的最深層元素開始冒泡至嵌套最淺的元素。例如MouseLeftButtonUp事件先從鼠標(biāo)直接點(diǎn)擊的元素上觸發(fā)然后才到其父元素(順著可視化樹繼續(xù)上行)。
從路由事件發(fā)生后,任意阻止冒泡的操作都可被路由事件沿途的控件捕獲并通知路由事件。在一些應(yīng)用場(chǎng)景中,某些標(biāo)準(zhǔn)控件需要捕獲所需的路由事件,比如一個(gè)Button捕獲MouseLeftButtonUp路由事件。不過我們要如何才能得知事件是否已經(jīng)被捕獲呢?
答案是UIElement中的AddHandler方法
比如我們有如下XAML:
<StackPanel x:Name="LayoutRoot"Background="White"><Button Height="25"Width="100"Content="點(diǎn)我啊!"x:Name="clickButton"/><Button Height="25"Width="100"Content="AddHandler"x:Name="addButton" /> </StackPanel>當(dāng)我們點(diǎn)擊clickButton按鈕時(shí)LayoutRoot對(duì)應(yīng)的MouseLeftButtonUp事件并不會(huì)觸發(fā),而當(dāng)我們點(diǎn)擊clickButton按鈕外的其他區(qū)域時(shí),LayoutRoot的MouseLeftButtonUp又被觸發(fā)了。
如果我們要讓clickButton捕獲LayoutRoot上的MouseLeftButtonUp事件,那就需要使用UIElement.AddHandler()方法。
該方法的簽名如下:
public void AddHandler(RoutedEvent routedEvent,
?Delegate handler,
bool handledEventsToo);
- 一個(gè)確切的路由事件 routedEvent
- 一個(gè)具有正確對(duì)應(yīng)類型的委托 handler
- 以及一個(gè)用來確定捕獲指定事件時(shí)是否發(fā)出通知的的布爾值handledEventsToo
于是在我們?yōu)閍ddButton的Click事件增加如下代碼
LayoutRoot.AddHandler(UIElement.MouseLeftButtonUpEvent,new MouseButtonEventHandler((o, args) => {MessageBox.Show("我是路由事件,我被觸發(fā)了,oh yeah!");}), true);如此,我們?cè)邳c(diǎn)擊clickButton的時(shí)候頁(yè)一樣可以捕獲到MouseLeftButtonUp事件了。
全部的后臺(tái)代碼如下:
public MainPage() {InitializeComponent();clickButton.Click += new RoutedEventHandler(clickButton_Click);addButton.Click += new RoutedEventHandler(addButton_Click); }void addButton_Click(object sender, RoutedEventArgs e) {LayoutRoot.AddHandler(UIElement.MouseLeftButtonUpEvent,new MouseButtonEventHandler((o, args) => {MessageBox.Show("我是路由事件,我被觸發(fā)了,oh yeah!");}), true);}void clickButton_Click(object sender, RoutedEventArgs e) {MessageBox.Show("我是按鈕,我被點(diǎn)了。");}
轉(zhuǎn)載于:https://www.cnblogs.com/024hi/archive/2010/01/29/1659221.html
總結(jié)
以上是生活随笔為你收集整理的[Silverlight]奇技银巧系列-5 捕获路由事件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重命名 docker 容器名
- 下一篇: 值类型与引用类型比较与区别