日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

WPF学习02:Routed Events

發(fā)布時間:2023/12/13 综合教程 33 生活家
生活随笔 收集整理的這篇文章主要介紹了 WPF学习02:Routed Events 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  與傳統(tǒng)的桌面開發(fā)相比,在事件模型上WPF引入了Routed Events,從開發(fā)者的角度上,我們獲得了兩個便利:

  1.可以實現(xiàn)事件路由,即向XAML結(jié)構(gòu)中的父元素路由或者是向子元素路由。

2. RoutedEventArgs作為默認(rèn)的事件Args為我們提供了更多的信息。

事件應(yīng)用示例

  建立工程“RoutedEvent”,初始的代碼修改Grid Layout為StackPanel,添加了一個Button,如下圖:

   

  編寫Click Event Handler:

 private void ButtonA_Click(object sender, RoutedEventArgs e)
 {
     System.Diagnostics.Debug.WriteLine("Get it");
 }

  我們有兩種方式為該按鈕添加Click Event Handler:

  XAML形式:

 <Button Name="ButtonA" Click="ButtonA_Click">ButtonA</Button>

  C#形式:

 ButtonA.AddHandler(Button.ClickEvent, new RoutedEventHandler(ButtonA_Click)); 
 ButtonA.Click += ButtonA_Click;  //這樣亦可,但只能用于該控件支持的事件

  結(jié)果:

  

  注意:一個事件,同一個handler添加多次的結(jié)果如下圖,是引發(fā)Bug的誘因之一:

  

  

RoutedEventArgs

  從上一個例子我們可以看到,WPF事件機(jī)制默認(rèn)提供的EventArgs為RoutedEventArgs

 public delegate void RoutedEventHandler(object sender, RoutedEventArgs e);

  與EventArgs相比,Routed Event提供了4個新的屬性.

  RoutedEvent:可以獲取到時間的類型,可以在一個Handler處理多個不同類型事件時用上。

  其它三個都與事件路由相關(guān):

  Handled,指定sender是否對該事件繼續(xù)路由,接下來的例子會展示它的作用。

  Source,該事件的觸發(fā)源。

  OriginalSource,通常與Source為同一個值。

  

事件路由

  以事件路由模式來分類,WPF提供了3種事件路由模式:

Direct (不路由)
Bubbling events(向上路由)
Tunneling events(向下路由)

  對于一個事件,如果不清楚它的路由模式,可以MSDN查一下:比如:MSDN上關(guān)于Click的說明:

  

  直接以例子來說明事件路由的作用:我們修改一下XAML代碼,如下:

 <StackPanel>
        <Button Name="ButtonA">ButtonA</Button>
        <Button Name="ButtonB">ButtonB</Button>
        <Button Name="ButtonC">ButtonC</Button>
        <Button Name="ButtonD">ButtonD</Button>
        <Button Name="ButtonE">ButtonE</Button>
        <Button Name="ButtonF">ButtonF</Button>
        <Button Name="ButtonG">ButtonG</Button>
        <Button Name="ButtonH">ButtonH</Button>
 </StackPanel>

  現(xiàn)在界面上有了8個Button,如果需要為8個按鈕都做事件處理,那要怎么做呢?通過事件路由我們可以很優(yōu)雅的解決:

  由于Click為向上路由的事件,我們隨便找它的一個父元素,比如stackPanel,填加一句代碼就好了:

 <StackPanel Button.Click="Button_Click">

  以下為Handler代碼:

private void Button_Click(object sender, RoutedEventArgs e)
{
    System.Diagnostics.Debug.WriteLine("Get Info From {0}", e.Source);
}

  結(jié)果:

  

  為頂層Window添加同樣的代碼會得到相同的結(jié)果,因為事件將一直路由到頂層。

  最后,回顧一下剛才RoutedEventArgs中的Handled.

  接下來的例子說明了如何通過設(shè)置Handled阻礙事件路由:

  XAML代碼:

 <Window x:Class="RoutedEvent.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" Button.Click="Button_Click">
    <StackPanel Name="StackPanelA">
        <Button Name="ButtonA">ButtonA</Button>
        <Button Name="ButtonB">ButtonB</Button>
        <Button Name="ButtonC">ButtonC</Button>
        <Button Name="ButtonD">ButtonD</Button>
        <Button Name="ButtonE">ButtonE</Button>
        <Button Name="ButtonF">ButtonF</Button>
        <Button Name="ButtonG">ButtonG</Button>
        <Button Name="ButtonH">ButtonH</Button>
    </StackPanel>
 </Window>

  C#代碼:

  

 public MainWindow()
 {
     InitializeComponent();
     StackPanelA.AddHandler(Button.ClickEvent, new RoutedEventHandler(StackPanel_Click), true);
 }
        
 private void Button_Click(object sender, RoutedEventArgs e)
 {
     System.Diagnostics.Debug.WriteLine("Get Info From {0}", e.Source);
 }

 private void StackPanel_Click(object sender, RoutedEventArgs e)
 {
    System.Diagnostics.Debug.WriteLine("I will block the routing", e.Source);
    e.Handled = true;
 }

  結(jié)果:事件路由將到了StackPanel即被阻礙,Window的對于Click 的Handler將不會觸發(fā),大家可以試試。

總結(jié)

以上是生活随笔為你收集整理的WPF学习02:Routed Events的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。