【发布时间】:2015-09-03 14:23:41
【问题描述】:
披露:这是我的第一个 WPF 应用程序。请接受我的无知。
在我的 WPF 应用程序中,我有一个带有 Grid 的 ControlTemplate 和下面的各种子项。在代码隐藏中,我使用 ControlTemplate 动态添加自定义 ContentControl 元素。
创建新控件时,它旨在捕获鼠标并允许拖动功能。如果 Grid 已经加载到窗口上并且我将起点设置为 MouseButtonEventArgs.GetPosition(window),则用于拖动计算的代码很好。但是当最初加载 Grid 时触发事件时,Point 等于窗口的倒数位置。例如。如果我的窗口在 (350,250),我的起点是 (-350,-250)。
private void GridLoaded(object sender, EventArgs e) { // fires MouseLeftButtonDown event for grid}
private void MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
...
m_start = e.GetPosition(this); // 'this' is the current window; returns the inverse coordinates of 'this'
...
}
是否有更合适的方法来获取我的鼠标位置的 x,y 坐标。如有必要,我可以使用屏幕坐标,但我发现的所有代码都使用 PointToScreen(m_start)。这没用,因为 m_start 不正确。
非常感谢任何帮助。
【问题讨论】:
-
WPF 和 WIndows 窗体都已经支持拖放,包括 DragEnter、DragOver、Drop 事件。您应该处理正确的事件,而不是尝试捕获鼠标位置。检查Drag & Drop Overview
-
拖放只处理父窗口上的移动,对吗?我之前尝试过实现它,但应用程序的要求是能够从窗口中拖动控件。 (在浏览器上思考标签)
-
没有。否则 DragEnter 事件没有多大意义。拖放是 Windows 操作,而不是视觉效果。它甚至不必以单击和拖动开始,您的应用程序可以使用 DoDragDrop 以编程方式发出拖动开始信号。例如,Visual Studio 中的控件工具箱会在您单击控件时启动拖动操作。
-
太棒了。我想我会更多地研究那个。谢谢。