【问题标题】:WPF - understanding RoutedEventsWPF - 理解 RoutedEvents
【发布时间】:2010-09-25 17:30:11
【问题描述】:

嗨 我正在学习 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 事件并通过可视化树向下传播。如果事件到达网格,则调用事件处理程序。 但是我错了,或者我做错了什么。有人可以解释一下正常事件和路由事件之间的区别

编辑 插入代码时发生了一些奇怪的事情。插入整个代码片段我只得到标签

【问题讨论】:

    标签: wpf xaml events routed-events routedevent


    【解决方案1】:

    不确定你的意思。 RoutedEvents 可以根据 RoutingStrategy 向上或向下移动可视化树。默认情况下,RoutingStrategy 设置为 Bubble(从子节点到父节点)。

    我尝试了您的代码,它的行为似乎符合预期。单击“图像和文本标签”,它会沿着可视树向上路由:TextBlock -> StackPanel -> Label -> Grid

    【讨论】:

    • 澄清:RoutingStrategy 的默认值仅影响您定义的新 RoutedEvents。现有控件上定义的事件都定义了一个特定的值,在许多情况下,Bubble 用于正常事件,而 Tunnel 用于关联的 Preview 事件。
    【解决方案2】:

    关键是我看不到路由事件的区别/优势(从这个例子来看)。在常规的 C# 中,我会做同样的事情 - 为表单上的每个元素添加处理程序(就像在此处完成的那样)。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-13
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多