使用DragMove方法在WPF中拖动窗口,然后在同一按钮上单击处理程序

时间:2010-08-28 21:13:01

标签: c# .net wpf wpf-controls

我需要一个按钮用于两个目的:
- 用户可以使用按钮
拖动应用程序的窗口 - 用户只需单击按钮即可切换窗口中其他元素的可见性。

该按钮是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

1 个答案:

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