WPF - 了解RoutedEvents

时间:2010-09-25 17:30:12

标签: wpf xaml events routed-events routedevent

您好 我正在学习WPF,目前我正在阅读有关RoutedEvents的内容。在“使用c#中的Pro 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>

关键是我发现路由事件没有区别/优势(本例中的判断)。 在常规的C#中我会做同样的事情 - 为我的表单上的每个元素添加处理程序(就像在这里完成的那样)。

起初,当我阅读路由事件时,它似乎就是这样。我为表单/控件/窗口上的所有可视元素的父级添加事件处理程序。如果我点击孩子,则会引发mousedown事件并通过可视树向下移动。如果事件到达网格,则调用事件处理程序。 但是我错了,或者我做错了。有人可以解释一下正常事件和路由事件之间的区别吗

编辑 插入代码时会发生一些奇怪的事情。整个代码snipet的内容我只得到标记

2 个答案:

答案 0 :(得分:0)

不确定你的意思。 RoutedEvents可以基于RoutingStrategy在可视树中上下移动。默认情况下,RoutingStrategy设置为Bubble(从子级到父级)。

我尝试了你的代码,它看起来像预期的那样。单击“图像和文本标签”,它会向上移动可视树:TextBlock - &gt; StackPanel - &gt;标签 - &gt;格

答案 1 :(得分:0)

  

关键是我发现路由事件没有区别/优势(通过这个例子来判断)。在常规的C#中我会做同样的事情 - 为我的表单上的每个元素添加处理程序(就像在这里完成的那样)。

示例的目的是展示如何将处理的事件标记为影响路由行为。如果选中“处理第一个事件”复选框,然后单击其中一个内部控件,则仅在该控件上引发事件。如果取消选中它,则会在可视树中的每个控件上引发它。

示例的作者处理树中每个对象的事件的唯一原因是为了证明这一点。通常你不会这样做;你只需处理最高级别的活动。