【问题标题】:Dragging a window in WPF using DragMove method and click handler on the same button使用 DragMove 方法在 WPF 中拖动窗口并单击同一按钮上的处理程序
【发布时间】:2010-08-28 21:13:00
【问题描述】:

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

按钮是 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,但没有帮助。

谢谢,米哈尔

【问题讨论】:

    标签: c# .net wpf wpf-controls


    【解决方案1】:

    DragMove 启动一个模态消息循环,直到释放鼠标按钮才返回,因此当按钮接收到 MouseLeftButtonDown 事件时,它已经失去了点击的机会。

    我假设您不希望在用户拖动窗口时发生单击。一种方法是执行类似于拖放的操作,并且仅当鼠标在按下时开始移动时才调用 DragMove。将处理程序附加到按钮上的 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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-23
      • 2023-03-21
      • 2012-10-26
      • 1970-01-01
      • 2013-05-02
      • 2014-03-04
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      相关资源
      最近更新 更多