- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想弄清楚是否有一个优雅的解决方案来解决我一直面临的问题。
所以基本上,我设计了一个无边框的加载启动画面,它可以通过拖动完全移动。我发现如果初始屏幕通过 Hide() 隐藏,然后通过 ShowDialog() 显示一个窗口,所有者设置为初始屏幕,就会发生这种情况。事情变得非常错误,但前提是你处于中间拖动状态(按下鼠标左键)。您将无法单击或移动任何内容,甚至 Visual Studio 也会变得无响应,除非您明确地按 alt-tab 退出应用程序。
考虑到我知道何时生成窗口,我在想也许有一种方法可以取消 DragMove 操作,但我没有运气。我发现 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() 方法有问题。 https://groups.google.com/forum/#!topic/wpf-disciples/7OcuXrf2whc
为了解决我决定拒绝使用它并实现移动逻辑。我结合了一些解决方案 https://www.codeproject.com/Questions/284995/DragMove-problem-help-pls和 C# WPF Move the window
private bool _inDrag;
private Point _anchorPoint;
private bool _iscaptured;
private void AppWindowWindowOnMouseMove(object sender, MouseEventArgs e)
{
if (!_inDrag)
return;
if (!_iscaptured)
{
CaptureMouse();
_iscaptured = true;
}
var mousePosition = e.GetPosition(this);
var mousePositionAbs = new Point
{
X = Convert.ToInt16(_appWindowWindow.Left) + mousePosition.X,
Y = Convert.ToInt16(_appWindowWindow.Top) + mousePosition.Y
};
_appWindowWindow.Left = _appWindowWindow.Left + (mousePositionAbs.X - _anchorPoint.X);
_appWindowWindow.Top = _appWindowWindow.Top + (mousePositionAbs.Y - _anchorPoint.Y);
_anchorPoint = mousePositionAbs;
}
private void AppWindowWindowOnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (_inDrag)
{
_inDrag = false;
_iscaptured = false;
ReleaseMouseCapture();
}
}
private void AppWindowWindowOnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
_anchorPoint = e.GetPosition(this);
_anchorPoint.Y = Convert.ToInt16(_appWindowWindow.Top) + _anchorPoint.Y;
_anchorPoint.X = Convert.ToInt16(_appWindowWindow.Left) + _anchorPoint.X;
_inDrag = true;
}
我花了整个昨天晚上,找到了一个更 hacky 但更实用的解决方案。支持最大化状态,不需要手动坐标计算。
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() 阻塞
上次求解的来源: DragMove() and Maximize C# WPF - DragMove and click
关于c# - WPF DragMove() 导致问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52336874/
我有一个使用透明窗口的 wpf 项目,我为我的对话框窗口和我的 mainwindow 共享这个透明窗口样式。 . 我的 DragMove() 出现错误我的事件 MainWindow在我关闭使用相同窗口
我在 WPF 中的自定义窗口(AllowTransparency,WindowStyle=None)有问题。 DragMove() 方法效果很好,但是当我最大化窗口时,或者通过 Windows 7 A
我有一个应用程序,它可以通过使用 DragMove 以典型模式拖动标题栏来移动: private void Window_MouseLeftButtonDown(object sender, Mous
我想弄清楚是否有一个优雅的解决方案来解决我一直面临的问题。 所以基本上,我设计了一个无边框的加载启动画面,它可以通过拖动完全移动。我发现如果初始屏幕通过 Hide() 隐藏,然后通过 ShowDial
我有一个移动层的滚动条,因此层在滚动条的“dragmove”回调中移动。这会导致所有绑定(bind)事件在移动层上断开连接! 请看这个 fiddle :http://jsfiddle.net/NY4Q
所以无论单击什么元素我都需要移动我的表单(我需要通过按住按钮拖动表单,表单是 100% 透明的),我尝试这样做: private void MessageForm_MouseDown(object
我有在 dragmove 上发生的动画。但是,我不想浪费周期来做比我必须做的更多的计算。本质上,我希望 dragmove 事件仅以合理的动画速率重绘。 换句话说,dragmove 事件尽可能快地进入,
我在 Windows 窗体中实现了类似于 DragMove 的东西,但边界设置为主屏幕边距的 10 个单位。 切换到 WPF 时,我发现了 this thread有助于实现相同的结果。 但是,由于这是
在 Vue/D3 项目中,我需要对某些可拖动元素的移动位置设置一些限制。 这是 dragmove 处理程序的摘录: dragmove: function(d, i, n) { // S
正如您可能从这篇文章的标题中了解到的那样,我快崩溃了。 好的,就是这样:我有一个 WPF 窗口,它承载着一个 WinForms 窗体,而窗体又承载着一个 ActiveX 控件。这都是由于遗留组件和想要
我是一名优秀的程序员,十分优秀!