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

Mic*_*zyk 0 .net c# 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>
Run Code Online (Sandbox Code Playgroud)

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();
        }
Run Code Online (Sandbox Code Playgroud)

问题是只有窗户移动才有效.单击该按钮不会调用Click事件处理程序.当我从按钮的图像中删除MouseLeftButtonDown事件处理时,将执行Click事件.

有谁能够帮我?是否可以创建这样的按钮?

我尝试在图像中将Handled设置为false但它没有帮助.

谢谢,米哈尔

Qua*_*ter 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>
Run Code Online (Sandbox Code Playgroud)

在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();
    }
}
Run Code Online (Sandbox Code Playgroud)