无法拖动和移动 WPF 表单

Posted

技术标签:

【中文标题】无法拖动和移动 WPF 表单【英文标题】:Cant drag and move a WPF Form 【发布时间】:2010-12-18 05:24:23 【问题描述】:

我设计了一个 Window Style=None 的 WPF 表单。所以我看不到表单中的拖动条。如何使用 WindowStyle=None 属性移动表单?

【问题讨论】:

【参考方案1】:

见this question。

基本上你为此使用Window.DragMove 方法。

【讨论】:

【参考方案2】:

在我们的应用程序中,我们将 WindowStyle 设置为“none”的 Windows,我们实现了拖动 Window 的功能,但仅从标题而不是从 Window 中的任何点拖动。我们通过添加一个边框作为标题来做到这一点,然后添加一个拇指来填充整个边框。然后,我们在 Window 的代码隐藏中处理 Thumb 上的 DragDelta 方法。

<Border 
        Name="headerBorder" 
        Width="Auto" 
        Height="50" 
        VerticalAlignment="Top"
        CornerRadius="5,5,0,0" 
        DockPanel.Dock="Top" 
        Background="StaticResource BackgroundBrush" 
        BorderThickness="1,1,1,1"
        BorderBrush="StaticResource BorderBrush">
        <Grid>
            <Thumb 
                x:Name="headerThumb" 
                Opacity="0" 
                Background="x:Null" 
                Foreground="x:Null" 
                DragDelta="headerThumb_DragDelta"/>
        </Grid>
    </Border>

然后在代码隐藏中我们有以下事件处理程序...

private void headerThumb_DragDelta(object sender, DragDeltaEventArgs e)

    Left = Left + e.HorizontalChange;
    Top = Top + e.VerticalChange;

我不知道这是否比其他方法更好,这就是我们所做的方式。

【讨论】:

【参考方案3】:

我正在使用一个主窗口来保存页面(创建一个导航样式程序),并且在我的主窗口后面的代码中,我插入了这个...

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)

    base.OnMouseLeftButtonDown(e);

    // Begin dragging the window
    this.DragMove();

...它就像一个魅力。这是windowstyle=none。从某种意义上说,您可以单击应用程序上的任意位置并移动它,而不是仅仅局限于顶部栏,这很不错。

【讨论】:

“就像你说的那样”:) 很好的解决方案,很好用。需要注意的一点是,这不适用于鼠标右键,它会导致“只能在主鼠标按钮按下时调用 DragMove。”【参考方案4】:

在加载函数的窗口内或在加载函数的网格内使用一个代理来触发鼠标单击时的 DragMove() 方法

private void Grid_Loaded(object sender, RoutedEventArgs e)

            this.MouseLeftButtonDown += delegateDragMove();;

【讨论】:

您应该使用 MouseLeftButtonDown 而不是 MouseDown,因为您只能在主鼠标按钮按下时调用 DragMove。 @DušanKnežević 是的,这是真的!我提出了一个快速运行的解决方案。【参考方案5】:

如果您只是添加 this.DragMove(); 并且您正在使用 Bing 地图,那么您在尝试平移地图时会遇到一些令人沮丧的行为。

使用TabbyCool's answer 是一个很好的解决方案,但是您不能将窗口拖到屏幕顶部以使其最大化。

我的解决方案只是检查我的点击相对于我的顶部条形网格的 position.Y 是否小于合适的数量。

 protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
    
        base.OnMouseLeftButtonDown(e);

        Point pt = e.GetPosition(topBar);

        Debug.WriteLine(pt.Y);

        if (pt.Y < topBar.ActualHeight)
        
            DragMove();
        
    

【讨论】:

以上是关于无法拖动和移动 WPF 表单的主要内容,如果未能解决你的问题,请参考以下文章

从 TabControl 拖动时出现表单 ShowDialog 问题

拖动并复制表单中的按钮

如何拖动 UIView 元素并更改位置?

Jquery ui“恢复”模态表单上的位置取消

如何防止窗户被移动?

如何在画布内拖动用户控件