标签: event-routing

为什么按钮点击事件"冒泡视觉树"到StackPanel,如MSDN文章所述?

在MSDN文章" 了解WPF中的路由事件和命令"中,它说明了这一点

事件将从源元素向上冒泡(传播)可视树,直到它被处理或到达根元素.

但是,在此示例中,当您单击按钮时,它不会"冒泡可视树"以由父StackPanel事件处理,即单击按钮不会触发任何事件.

为什么不?如果不是这样的话,他们是什么意思"冒泡"

XAML:

<Window x:Class="TestClickEvents456.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">
    <StackPanel x:Name="TheStackPanel"
                Background="Yellow"
                MouseDown="TheStackPanel_MouseDown">
        <Button x:Name="TheButton"
                Margin="10"
                Content="Click This"/>
        <TextBlock x:Name="TheMessage"
                   Text="Click the button or the yellow area"/>
    </StackPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)

后台代码:

using System.Windows;
using System.Windows.Input;

namespace TestClickEvents456
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void TheStackPanel_MouseDown(object sender, MouseButtonEventArgs e)
        {
            TheMessage.Text = "StackPanel was clicked.";
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

c# wpf event-routing

21
推荐指数
3
解决办法
2万
查看次数

如何防止InvokeCommandAction将事件传播到父元素?

我意识到当使用与EventTrigger关联的InvokeCommandAcction时,原始事件仍然会路由到父元素,直到它被处理.好吧,我想这是一种预期的行为.但我的问题是如何将事件标记为Handled,以便它不会在整个UI树中传播?

实际上,当您在命令中处理此事件时,所有内容都将在此命令中处理,因此不需要传播.在我发现的一个案例中,它会导致一些不必要的行为.例如,当用户双击元素(MouseDoubleClick事件)时,我打开一个新窗口.问题是新窗口打开然后主窗口返回到新窗口的前面,因为MouseDoubleClick事件刚刚到达UI树中的顶部元素.想要的行为是保持新窗口在前面,但是当InvokeCommandAction让事件向上传播时,主窗口会收回焦点......

我可以做的是使用CallMethodAction资产,但因为我在MVVM场景中,我不想在我的代码中使用UI事件参数.即使这会让我隐含地将事件标记为已处理并解决问题.

<UserControl x:Class="..."
             xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseDoubleClick">
            <i:InvokeCommandAction Command="{Binding Path=DisplayReportCommand}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
    ...
</UserControl>
Run Code Online (Sandbox Code Playgroud)

wpf command mvvm event-routing invoke-command

14
推荐指数
1
解决办法
3687
查看次数

标签 统计

event-routing ×2

wpf ×2

c# ×1

command ×1

invoke-command ×1

mvvm ×1