LeftMouseButtonDown не работает с кнопками в перенаправленных событиях - PullRequest
0 голосов
/ 03 июня 2009

Я узнал о перенаправленных событиях в 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). Вы можете помочь мне с этим?

Обновление:

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

Ответы [ 2 ]

1 голос
/ 03 июня 2009

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

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

 <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 здесь , которую стоит прочитать.

0 голосов
/ 03 июня 2009

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

...