我在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();
}
答案 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。