Событие Mousedown срабатывает дважды (WPF)

В настоящее время я пытаюсь захватить указатель мыши с изображения на простой сетке. У меня нет проблем с запуском события, просто оно срабатывает дважды. А поскольку двойной щелчок по нему в конечном итоге будет иметь другое состояние (будет отображаться расширенное изображение), переход сразу ко второму щелчку вызывает проблемы.

Мой текущий код выглядит следующим образом:

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");
        }

    }
}

Поэтому, когда я нажимаю на изображение, он дважды запускает мышь.

Спасибо!


person Angelus    schedule 17.05.2011    source источник


Ответы (3)


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.

person Mike Diaz    schedule 17.05.2011
comment
Вау, это было проще, чем я думал! Большое спасибо! :) - person Angelus; 17.05.2011
comment
После более чем часа поиска и отладки я наконец нашел это! - person Evils; 16.08.2013
comment
Хотя это работает, возможно, стоит подумать о регистрации события только один раз, как в ответе @Ahmed Ghoneim. - person sa.he; 10.02.2020

Вам нужно будет установить для e.Handled значение true, чтобы предотвратить всплытие события из изображения в сетку.

По сути, происходит то, что событие вызывается в изображении, затем, если оно не обрабатывается, оно вызывается в сетке и так далее вверх по визуальному дереву.

person CodeNaked    schedule 17.05.2011

Это ваш XAML, и вы добавили [ 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>

Сделайте так, как ONE [ MouseDown="Generic_MouseDown" ] в Grid

<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>
person Ahmed Ghoneim    schedule 17.05.2011