鼠标按下事件在WPF中触发两次问题

6

我目前正在尝试从简单网格上的图像中捕获鼠标按下事件。我的问题不在于事件是否触发,而是它会触发两次。因为连续点击两次最终会导致不同的状态(它将显示一个扩展图像),直接进入第二次点击会导致问题。

我的当前代码如下:

XAML

<Window x:Class="WpfApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid Background="Transparent" x:Name="MainContent" MouseDown="Generic_MouseDown">
        <Image Source="http://www.blogcdn.com/www.engadget.com/media/2011/05/welcome-kansas-city-google-high-speed-internet.jpg" Height="100" Width="100" MouseDown="Generic_MouseDown"/>
    </Grid>
</Window>

代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Generic_MouseDown(object sender, MouseButtonEventArgs e)
    {
        if (((FrameworkElement)e.Source).GetType() == typeof(System.Windows.Controls.Image))
        {
            Console.Out.WriteLine("image clicked");
        }
        else
        {
            Console.Out.WriteLine("grid clicked");
        }

    }
}

所以当我点击图片时,它会两次触发mousedown事件。
谢谢!
3个回答

16
private void Generic_MouseDown(object sender, MouseButtonEventArgs e)
{
    if (((FrameworkElement)e.Source).GetType()   
           == typeof(System.Windows.Controls.Image))
    {
        Debug.WriteLine("image clicked");
        e.Handled = true;
    }
    else
    {
        Debug.WriteLine("grid clicked");
    }

}

你需要将Handled属性设置为true。


1
哇,这比我想象的要容易!非常感谢! :) - Angelus
经过一个多小时的搜索和调试,我终于找到了这个! - Evils
虽然这样做可以工作,但考虑像@Ahmed Ghoneim的回答那样仅注册事件可能是值得的。 - sa.he

6

您需要将e.Handled设置为true,以防止事件从图像冒泡到网格。

实际上,发生的情况是事件在图像上引发,然后如果没有处理它,则在网格上引发,依此类推直到可视树的顶部。


2

这是您的XAML代码,您在Grid和Image上添加了[MouseDown="Generic_MouseDown"]两次

<Window x:Class="WpfApplication.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid Background="Transparent" x:Name="MainContent" MouseDown="Generic_MouseDown">
            <Image Source="http://www.blogcdn.com/www.engadget.com/media/2011/05/welcome-kansas-city-google-high-speed-internet.jpg" Height="100" Width="100" MouseDown="Generic_MouseDown"/>
        </Grid>
    </Window>

让它像那个在Grid中MouseDown="Generic_MouseDown"的ONE一样。
<Window x:Class="WpfApplication.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid Background="Transparent" x:Name="MainContent" MouseDown="Generic_MouseDown">
            <Image Source="http://www.blogcdn.com/www.engadget.com/media/2011/05/welcome-kansas-city-google-high-speed-internet.jpg" Height="100" Width="100" />
        </Grid>
    </Window>

或者

让它像那个一个 [ MouseDown="Generic_MouseDown" ] 在图像中一样

<Window x:Class="WpfApplication.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid Background="Transparent" x:Name="MainContent">
            <Image Source="http://www.blogcdn.com/www.engadget.com/media/2011/05/welcome-kansas-city-google-high-speed-internet.jpg" Height="100" Width="100" MouseDown="Generic_MouseDown"/>
        </Grid>
    </Window>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接