为什么MouseDown事件处理程序没有被命中?

时间:2016-05-13 15:53:43

标签: c# wpf xaml

我在WPF中有一个非常简单的按钮,它应该在 MouseDown 上调用函数preview(),在 MouseUp上调用函数hide() 。然而,它不起作用,甚至没有击中它的事件处理程序。我的错是什么?

我尝试更改背景属性,没用。 MouseLeave MouseClick 都可以正常工作,但这不是我想要的。

XAML:

<Button x:Name="previewButton" Background="#FF383434" Margin="5,5,8,0" MouseDown="previewButton_MouseDown" MouseUp="previewButton_MouseUp" MouseLeave="previewButton_MouseLeave" TouchDown="previewButton_TouchDown" TouchUp="previewButton_TouchUp" TouchLeave="previewButton_TouchLeave" Grid.Row="1" Click="previewButton_Click" Padding="0" >
    <StackPanel Height="98" Width="49">
        <Image Source="/EZ3D;component/Resources/old/eye.png" Margin="0,17,0,0" />
        <TextBlock Text="Preview" TextWrapping="WrapWithOverflow" Margin="0" HorizontalAlignment="Center" Padding="0" FontSize="13" VerticalAlignment="Center"/>
    </StackPanel>
</Button>

背后的代码

private void previewButton_TouchDown(object sender, TouchEventArgs e)
{
    ShowPreviewImage();
}

private void previewButton_TouchUp(object sender, TouchEventArgs e)
{
    HidePreviewImage();
}

private void previewButton_TouchLeave(object sender, TouchEventArgs e)
{
    HidePreviewImage();
}

private void previewButton_MouseDown(object sender, MouseButtonEventArgs e)
{
    ShowPreviewImage();
}

private void previewButton_Click(object sender, RoutedEventArgs e)
{
    ShowPreviewImage();
}

private void previewButton_MouseUp(object sender, MouseButtonEventArgs e)
{
    HidePreviewImage();
}

private void previewButton_MouseLeave(object sender, MouseEventArgs e)
{
    HidePreviewImage();
}

2 个答案:

答案 0 :(得分:2)

处理 PreviewMouseDown 而不是MouseDown事件,使用PreviewMouseUp而不是MouseUp等等。它应该适合你。

<Button x:Name="previewButton" Background="#FF383434" Margin="5,5,8,0" PreviewMouseDown="previewButton_MouseDown" MouseDown="previewButton_MouseDown" PreviewMouseUp="" MouseUp="previewButton_MouseUp" MouseLeave="previewButton_MouseLeave" TouchDown="previewButton_TouchDown" TouchUp="previewButton_TouchUp" TouchLeave="previewButton_TouchLeave" Grid.Row="1" Click="previewButton_Click" Padding="0" >
            <StackPanel Height="98" Width="49">
                <Image x:Name="Image1" Source="/EZ3D;component/Resources/old/eye.png" Margin="0,17,0,0" />
                <TextBlock Text="Preview" TextWrapping="WrapWithOverflow" Margin="0" HorizontalAlignment="Center" Padding="0" FontSize="13" VerticalAlignment="Center"/>
            </StackPanel>
        </Button>

所有FrameworkElements都会公开这些事件。所有'预览...'事件都是'隧道'事件,而其他鼠标事件是'泡泡'事件。隧道事件首先在更高级别的元素上引发,例如如果将鼠标悬停在按钮元素上,则第一个预览鼠标事件将进入窗口,然后向下遍历其所有后代,直到达到最终目标,在本例中为按钮。然后,正常的,即非预览的鼠标事件从那里开始冒泡,直到它到达窗口。沿着此链的任何位置,事件处理程序都可以将事件标记为已处理并停止该过程。这里MouseDown冒泡事件由放置在按钮内的文本块处理。

答案 1 :(得分:0)

某些控件在内部处理输入事件,在这些情况下,您通常可以使用隧道版本的事件(Preview*)。请参阅MSDN