C# WPF DragMove()导致问题

C# WPF DragMove()导致问题,c#,.net,wpf,C#,.net,Wpf,我在想我所面临的问题是否有一个优雅的解决方案 所以基本上,我设计了一个无边界加载的启动屏幕,它可以通过拖动完全移动。我发现,如果启动屏幕通过Hide()隐藏,然后通过ShowDialog()显示一个所有者设置为启动屏幕的窗口,就会发生这种情况。事情会变得非常糟糕,但只有当你处于拖动中(鼠标左键按下)时才会发生。您将无法单击或移动任何内容,甚至VisualStudio也将失去响应,除非您将alt tab显式移出应用程序 考虑到我知道什么时候我会生成窗口,我在想也许有办法取消拖拽操作,但我没有运气。

我在想我所面临的问题是否有一个优雅的解决方案

所以基本上,我设计了一个无边界加载的启动屏幕,它可以通过拖动完全移动。我发现,如果启动屏幕通过Hide()隐藏,然后通过ShowDialog()显示一个所有者设置为启动屏幕的窗口,就会发生这种情况。事情会变得非常糟糕,但只有当你处于拖动中(鼠标左键按下)时才会发生。您将无法单击或移动任何内容,甚至VisualStudio也将失去响应,除非您将alt tab显式移出应用程序

考虑到我知道什么时候我会生成窗口,我在想也许有办法取消拖拽操作,但我没有运气。我发现DragMove是同步的,所以我猜它必须从不同的线程或事件回调中取消

编辑:

public partial class Window_Movable : Window
{
    public Window_Movable()
    {
        InitializeComponent();
    }

    public Boolean CanMove { get; set; } = true;

    private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        if (CanMove == false)
            return;

        Task.Factory.StartNew(() => {
            System.Threading.Thread.Sleep(1000);

            Dispatcher.Invoke(() => {
                Hide();
                new Window_Movable() {
                    Title = "MOVABLE 2",
                    CanMove = false,
                    Owner = this
                }.ShowDialog();
            });
        });

        DragMove();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Console.WriteLine("DING");
    }
}

我也遇到了同样的问题,并且发现DragMove()方法是一个问题。

为了解决这个问题,我决定拒绝使用它并实现移动逻辑。 我结合了一些来自 和

我昨天晚上花了一整晚的时间,找到了一个更老套但更实用的解决方案。支持最大化状态,不需要手动坐标计算

    private bool _mRestoreForDragMove;
    private void OnAppWindowWindowOnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        if (e.ClickCount == 2)
        {
            if (_appWindowWindow.ResizeMode != ResizeMode.CanResize &&
                _appWindowWindow.ResizeMode != ResizeMode.CanResizeWithGrip)
            {
                return;
            }

            _appWindowWindow.WindowState = _appWindowWindow.WindowState == WindowState.Maximized
                ? WindowState.Normal
                : WindowState.Maximized;
        }
        else
        {
            _mRestoreForDragMove = _appWindowWindow.WindowState == WindowState.Maximized;

            SafeDragMoveCall(e);
        }
    }

    private void SafeDragMoveCall(MouseEventArgs e)
    {
        Task.Delay(100).ContinueWith(_ =>
        {
            Dispatcher.BeginInvoke((Action)
                delegate
                {
                    if (Mouse.LeftButton == MouseButtonState.Pressed)
                    {
                        _appWindowWindow.DragMove();
                        RaiseEvent(new MouseButtonEventArgs(e.MouseDevice, e.Timestamp, MouseButton.Left)
                        {
                            RoutedEvent = MouseLeftButtonUpEvent
                        });
                    }
                });
        });
    }

    private void OnMouseMove(object sender, MouseEventArgs e)
    {
        if (_mRestoreForDragMove)
        {
            _mRestoreForDragMove = false;

            var point = PointToScreen(e.MouseDevice.GetPosition(this));

            _appWindowWindow.Left = point.X - (_appWindowWindow.RestoreBounds.Width * 0.5);
            _appWindowWindow.Top = point.Y;

            _appWindowWindow.WindowState = WindowState.Normal;

            _appWindowWindow.DragMove();

            SafeDragMoveCall(e);
        }
    }

    private void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        _mRestoreForDragMove = false;
    }
问题是在短时间延迟后发送LeftMouseButtonUp事件,以避免来自DragMove()的阻塞

上次解决的来源:

和另一个完全不同的解决方案。要使窗口可移动,可以使用WindowChrome的标题高度。 i、 e

但是您还应该为窗口中的所有控件设置附加属性
WindowChrome.ishitestvisibleinchrome=“True”

    private bool _mRestoreForDragMove;
    private void OnAppWindowWindowOnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        if (e.ClickCount == 2)
        {
            if (_appWindowWindow.ResizeMode != ResizeMode.CanResize &&
                _appWindowWindow.ResizeMode != ResizeMode.CanResizeWithGrip)
            {
                return;
            }

            _appWindowWindow.WindowState = _appWindowWindow.WindowState == WindowState.Maximized
                ? WindowState.Normal
                : WindowState.Maximized;
        }
        else
        {
            _mRestoreForDragMove = _appWindowWindow.WindowState == WindowState.Maximized;

            SafeDragMoveCall(e);
        }
    }

    private void SafeDragMoveCall(MouseEventArgs e)
    {
        Task.Delay(100).ContinueWith(_ =>
        {
            Dispatcher.BeginInvoke((Action)
                delegate
                {
                    if (Mouse.LeftButton == MouseButtonState.Pressed)
                    {
                        _appWindowWindow.DragMove();
                        RaiseEvent(new MouseButtonEventArgs(e.MouseDevice, e.Timestamp, MouseButton.Left)
                        {
                            RoutedEvent = MouseLeftButtonUpEvent
                        });
                    }
                });
        });
    }

    private void OnMouseMove(object sender, MouseEventArgs e)
    {
        if (_mRestoreForDragMove)
        {
            _mRestoreForDragMove = false;

            var point = PointToScreen(e.MouseDevice.GetPosition(this));

            _appWindowWindow.Left = point.X - (_appWindowWindow.RestoreBounds.Width * 0.5);
            _appWindowWindow.Top = point.Y;

            _appWindowWindow.WindowState = WindowState.Normal;

            _appWindowWindow.DragMove();

            SafeDragMoveCall(e);
        }
    }

    private void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        _mRestoreForDragMove = false;
    }
   var windowChrome = 
            WindowChrome.GetWindowChrome(appWindow.Window);
            windowChrome.CaptionHeight = MainWindowToolbar.Height;
    WindowChrome.SetWindowChrome(appWindow.Window, windowChrome);