2010-09-25 62 views
0

嗨 我learnign WPF和目前我正在閱讀有關RoutedEvents。在本書「臨WPF在C#中」有一些代碼snipet我呈給下面WPF - 瞭解路由事件

<Window x:Class="RoutedEventsLearning.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300" MouseUp="SomethingClicked" > 
    <Grid Margin="3" MouseUp="SomethingClicked"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"></RowDefinition> 
      <RowDefinition Height="*"></RowDefinition> 
      <RowDefinition Height="Auto"></RowDefinition> 
      <RowDefinition Height="Auto"></RowDefinition> 
     </Grid.RowDefinitions> 
     <Label Margin="5" Grid.Row="0" HorizontalAlignment="Left" 
Background="AliceBlue" BorderBrush="Black" BorderThickness="1" 
MouseUp="SomethingClicked"> 
      <StackPanel MouseUp="SomethingClicked"> 
       <TextBlock Margin="3" 
MouseUp="SomethingClicked"> 
Image and text label</TextBlock> 
       <Image Stretch="None" 
MouseUp="SomethingClicked" /> 
       <TextBlock Margin="3" 
MouseUp="SomethingClicked"> 
Courtesy of the StackPanel</TextBlock> 
      </StackPanel> 
     </Label> 
     <ListBox Grid.Row="1" Margin="5" Name="lstMessages"></ListBox> 
     <CheckBox Grid.Row="2" Margin="5" Name="chkHandle"> 
      Handle first event</CheckBox> 

    </Grid> 
</Window> 

的一點是,我看到的路由事件的無差異/優勢(通過這個例子judgin)。 在常規的C#中,我會做同樣的事情 - 爲表單上的每個元素添加處理程序(就像在這裏完成的那樣)。

起初,當我閱讀關於路由事件時,它似乎是這樣工作的。我爲窗體/控件/窗口上的所有可視元素的父級添加事件處理程序。如果我點擊孩子,mousedown事件就會上升並通過視覺樹向下傳播。如果事件到達網格,則調用事件處理程序。 但是我錯了,或者我做錯了。有人可以解釋我正常事件和路由事件之間的區別

編輯 插入代碼時發生了一些奇怪的事情。全部代碼snipet insted我得到只有標籤

回答

0

不知道你的意思。 RoutedEvents可以根據RoutingStrategy在視覺樹上上下移動。默認情況下,RoutingStrategy設置爲Bubble(從小孩旅行到父母)。

我試過你的代碼,它看起來像預期的那樣。點擊「圖像和文本標籤」,它將視覺樹路由:TextBlock - > StackPanel - > Label - > Grid

+0

澄清:RoutingStrategy的默認值僅影響您定義的新RoutedEvents。在現有控件上定義的事件都定義了一個特定的值,在很多情況下,Bubble爲普通事件,Tunnel爲關聯預覽事件。 – 2010-09-25 21:28:33

0

重點是我沒有發現路由事件的差異/優勢(通過這個例子來判斷) 。在常規的C#中,我會做同樣的事情 - 爲表單上的每個元素添加處理程序(就像這裏完成的那樣)。

該示例的要點是顯示如何標記處理的事件影響路由行爲。如果選中「處理第一個事件」複選框,然後單擊其中一個內部控件,則僅在該控件上引發該事件。如果取消選中它,它會在視覺樹中的每個控件上產生。

該示例的作者處理樹中每個對象上的事件的唯一原因是爲了演示此操作。通常你不會這樣做;你只需要在最有用的水平上處理事件。