Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF-了解路由事件_Wpf_Xaml_Events_Routed Events_Routedevent - Fatal编程技术网

WPF-了解路由事件

WPF-了解路由事件,wpf,xaml,events,routed-events,routedevent,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

嗨 我正在学习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>

图像和文本标签
由StackPanel提供
处理第一个事件
关键是我看不到路由事件的区别/优势(通过本例判断)。 在常规C#中,我会做同样的事情——将处理程序添加到表单上的每个元素(就像这里所做的那样)

起初,当我阅读有关路由事件的文章时,它似乎是这样工作的。我为窗体/控件/窗口上所有可视元素的父级添加事件处理程序。如果我单击子对象,mousedown事件将被引发,并在可视化树中向下移动。如果事件到达网格,则调用事件处理程序。 然而我错了,或者我做错了什么。有人能给我解释一下正常事件和路由事件的区别吗

编辑
插入代码时发生了一些奇怪的事情。除了整个代码,我只得到一个标签,不知道你的意思。RoutedEvents可以根据RoutingStrategy在可视树上向上或向下移动。默认情况下,RoutingStrategy设置为Bubble(从子级移动到父级)

我尝试了你的代码,它的行为似乎和预期的一样。点击“图像和文本标签”,它会沿着视觉树向上排列:TextBlock->StackPanel->label->Grid

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

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


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

澄清一下:RoutingStrategy的默认值仅影响您定义的新RoutedEvents。在现有控件上定义的事件都定义了一个特定的值,在许多情况下,普通事件为气泡,关联预览事件为隧道。