LeftMouseButtonDown не работает с кнопками в маршрутизируемых событиях

Я узнал о маршрутизируемых событиях в wpf и попробовал следующий пример:

Файл -- Window1.xaml

<ScrollViewer VerticalScrollBarVisibility="Auto">
    <UniformGrid MouseDown="UniformGrid_MouseDown">
        <Button x:Name="Button1">1</Button>
        <Button x:Name="Button2">2</Button>
        <Button x:Name="Button3">3</Button>
        <Button x:Name="Button4">4</Button>
        <Button x:Name="Button5">5</Button>
        <Button x:Name="Button6">6</Button>
        <Button x:Name="Button7">7</Button>
        <Button x:Name="Button8">8</Button>
        <Button x:Name="Button9">9</Button>
    </UniformGrid>
</ScrollViewer>

Файл -- Window1.xaml.cs

private void UniformGrid_MouseDown(object sender, MouseButtonEventArgs e)
{
    Button aTargetButton = e.Source as Button;
    if (aTargetButton != null)
    {
        aTargetButton.Background = Brushes.Azure;
        aTargetButton.LayoutTransform = new RotateTransform(45);
        if (myPreviouslyClickedButton != null)
        {
            myPreviouslyClickedButton.Background = Brushes.White;
            myPreviouslyClickedButton.LayoutTransform = new RotateTransform(0);
        }
        myPreviouslyClickedButton = aTargetButton;
    }
}

Когда я запустил эти фрагменты, соответствующая кнопка претерпевает угловое преобразование только тогда, когда я щелкаю по ней правой кнопкой мыши (хотя я подписался на MouseDown). Можете ли вы помочь мне с этим?

Обновлять:

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


person Community    schedule 03.06.2009    source источник


Ответы (2)


Событие нажатия кнопки мыши обрабатывается кнопкой.

Если вы хотите, чтобы ваша сетка обрабатывала события кнопки, вы можете сделать что-то вроде:

 <ScrollViewer VerticalScrollBarVisibility="Auto">
    <UniformGrid Button.Click="UniformGrid_Click">
        <Button x:Name="Button1" Margin="10">1</Button>
        <Button x:Name="Button2">2</Button>
        <Button x:Name="Button3">3</Button>
        <Button x:Name="Button4">4</Button>
        <Button x:Name="Button5">5</Button>
        <Button x:Name="Button6">6</Button>
        <Button x:Name="Button7">7</Button>
        <Button x:Name="Button8">8</Button>
        <Button x:Name="Button9">9</Button>
    </UniformGrid>
    </ScrollViewer>

и измените источник на что-то вроде:

private void UniformGrid_Click(object sender, RoutedEventArgs e)
    {
        // Your code here
    }

Есть статья msdn здесь, которую стоит прочитать.

person corey broderick    schedule 03.06.2009

Это работает правильно. Внутри Button обрабатывает событие MouseDown, чтобы знать, когда запускать событие Click. Я обнаружил, что Snoop — отличный инструмент для отслеживания проблем с событиями WPF или просто для получения лучшее понимание того, как они работают.

person Andy    schedule 03.06.2009