【问题标题】:Distinguish the clicked element in WPF routed event区分 WPF 路由事件中的单击元素
【发布时间】:2017-05-31 16:51:50
【问题描述】:

在 WPF 中,我使用的是带有自定义控件模板的按钮。

我的按钮包含几个子元素,例如图像。

<ControlTemplate x:Key="myKey" TargetType="Button">
...
   <StackPanel Orientation="Horizontal" DockPanel.Dock="Bottom" HorizontalAlignment="Right">
      <Image x:Name="img1"  />
       ...
      <Image x:Name="img2"  />

我已将一个 Click-Handler 应用于使用上述模板的按钮。

现在我想知道,按钮的可视树中的哪个元素被准确地点击了。例如img1、img2、...

能否使用点击事件的路由事件参数来区分原始元素?

谢谢

勒内

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    这可以通过使用PreviewMouseDown 事件(而不是Click 事件)来实现,例如

    <Button Template="{StaticResource myKey}"
            PreviewMouseDown="Button_PreviewMouseDown"
            Click="Button_Click"/>
    

    您可以使用事件参数的OriginalSource 获取图像(如果点击源是图像)。通过将其与经典的 Click 事件相结合,您可以获得点击的图像。

    private Image buttonDownImage;
    
    private void Button_PreviewMouseDown(object sender, MouseButtonEventArgs e)
    {
        buttonDownImage = e.OriginalSource as Image;
    }
    
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        if (buttonDownImage != null)
        {
            //The click source the buttonDownImage
        }
    }
    

    原因是路由策略,这意味着事件正在采取的方式。有关此路由策略的更多信息,请访问MSDN 或此WPF tutorial。

    【讨论】:

    • 这不是我想要的。 PreviewMouseDown 事件包含作为原始源的图像 - 到目前为止有效。但 PreviewMouseUp 事件不包含图像。因此,用户可以单击按钮上的子图像,将鼠标移开,释放按钮,我会将其识别为“单击”我的图像。有没有办法直接使用(冒泡)点击事件?
    • 我也有同样的想法。但这会导致一个问题:当用户单击、将鼠标移到按钮外并在按钮外释放时,会触发预览事件,但不会触发单击事件。因此,下次用户单击按钮时“buttonDownImage”不为空 - 无论第二次单击是否在图像上。如果用户在单击的按钮之外释放鼠标按钮,我没有找到任何可靠的方法来重置全局标志
    • 我认为那不正确:让我们举个例子:点击被中止,buttonDownImage 不为空。如果用户再次单击(不是在图像上)buttonDownImage = e.OriginalSource as Image; 设置为 null(因为源不是图像)。这意味着该方法有效。
    • 哦..你是绝对正确的。我认为今天在我的办公室里很暖和;)我最初的解决方案与您的有点不同,因此我没有看到它真的很容易。剩下的小问题:用户单击图像,离开图像但停留在按钮上 - >单击发生状态为“图像单击”。但这对我来说没关系->解决了。非常感谢您的帮助
    • 我想通过使用PreviewMouseUp事件来解决这个小问题。
    猜你喜欢
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多