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