是否可以在 C# 中将某些内容从对话框窗口拖动到其父级



举个例子,假设我有一个带有列表框的表单。从这个窗体中,我使用dialog.ShowDialog(this)打开一个对话框窗口,其中包含另一个列表框。通常,用户会双击对话框列表框中的项目以将其添加到所有者窗体的列表框中,然后在完成后关闭对话框。我想知道我是否可以启用拖放,以便用户可以将项目从对话框的列表框拖动到所有者窗体的列表框。据我所知,至少在我的Windows 7计算机上(使用.Net Framework 4.0(,这是不可能的。

我想要但不是必需的另一个功能是,当用户将项目拖到所有者窗体上时,可以将所有者表单放在对话框窗口的前面。(这是为了使用户能够在拖动时更好地查看所有者窗体上的列表框。

我认为这是不可能的,更准确地说是不明智的。澄清我是否错了。您尝试做的是从叠加在窗体上的模式中拖动一个项目(而不是双击并将数据冒泡回父级(。为了实现拖放,您必须在单击拖动时以某种方式触发对模态的焦点丢失,然后放下,之后您想重新获得对模态的关注。对我来说,这似乎是一种迂回的方式

,可以改善生活质量。

这可以通过让所有者窗体直接处理拖动事件而不是让窗体上的子控件处理拖动事件来完成。设置窗体的AllowDrop = true和处理拖放和拖动事件。可以在窗体的拖动事件中使用control.ClientRectangle.Contains(control.PointToClient(new Point(e.X, e.Y)))来确定鼠标是否位于所需控件的客户端区域中。

您不能将所有者窗口放在对话框前面(并且可能不应该尝试(,但用户可以在开始拖动之前根据需要轻松地将对话框移开。

注意: 您可能希望向窗体的 DragOver 事件添加if (!this.CanFocus) e.Effect = DragDropEffects.None;,以便在显示对话框时禁用拖动事件,除非拖动来自对话框窗口。

最新更新