我需要一个按钮用于两个目的:
- 用户可以使用按钮
拖动应用程序的窗口
- 用户只需单击按钮即可切换窗口中其他元素的可见性。
该按钮是PNG图像。
我试图通过以下方式实现:
XAML:
<Button Name="toggleButton" Click="toggleButton_Click" Canvas.Left="177" Canvas.Top="0">
<Button.Template>
<ControlTemplate>
<Image Source="/FootballRssReader;component/images/ball.png" MouseLeftButtonDown="toggleButton_MouseLeftButtonDown"/>
</ControlTemplate>
</Button.Template>
</Button>
C#:
private void toggleButton_Click(object sender, RoutedEventArgs e)
{
contentVisible = !contentVisible;
content.Visibility = contentVisible ? Visibility.Visible : Visibility.Collapsed;
}
private void toggleButton_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
DragMove();
}
问题是只有窗户移动才有效。单击该按钮不会调用Click事件处理程序。当我从按钮的图像中删除MouseLeftButtonDown事件处理时,将执行Click事件。
任何人都可以帮助我吗?是否可以创建这样的按钮?
我尝试在图片中将Handled设置为false,但它没有帮助。
谢谢,Michal
答案 0 :(得分:8)
DragMove启动一个模态消息循环,直到释放鼠标按钮才返回,所以当按钮收到MouseLeftButtonDown事件时,它已经失去了点击的机会。
我假设如果用户拖动窗口,您不希望发生Click。一种方法是执行与拖放类似的操作,并且只有在鼠标按下时才开始移动时才调用DragMove。将处理程序附加到Button上的PreviewMouseLeftButtonDown和PreviewMouseMove:
<Button Name="toggleButton" Click="toggleButton_Click"
Canvas.Left="177" Canvas.Top="0"
PreviewMouseMove="toggleButton_PreviewMouseMove"
PreviewMouseLeftButtonDown="toggleButton_PreviewMouseLeftButtonDown">
<Button.Template>
<ControlTemplate>
<Image Source="/FootballRssReader;component/images/ball.png"/>
</ControlTemplate>
</Button.Template>
</Button>
在PreviewLeftMouseButtonDown处理程序中记录鼠标位置,如果鼠标已开始移动,则在PreviewMouseMove处理程序中启动DragMove:
private Point startPoint;
private void toggleButton_PreviewMouseLeftButtonDown(
object sender, MouseButtonEventArgs e)
{
startPoint = e.GetPosition(toggleButton);
}
private void toggleButton_PreviewMouseMove(object sender, MouseEventArgs e)
{
var currentPoint = e.GetPosition(toggleButton);
if (e.LeftButton == MouseButtonState.Pressed &&
toggleButton.IsMouseCaptured &&
(Math.Abs(currentPoint.X - startPoint.X) >
SystemParameters.MinimumHorizontalDragDistance ||
Math.Abs(currentPoint.Y - startPoint.Y) >
SystemParameters.MinimumVerticalDragDistance))
{
// Prevent Click from firing
toggleButton.ReleaseMouseCapture();
DragMove();
}
}