[英]How to use ctrl key + mouse click to select multiple controls?
可能这个问题已经在这里找到答案了,但是我找不到它。我在每个选项卡页面中都有一个带有flowlayoutpanel的tabControl,可以在运行时添加控件。 我可以重新排列它们,在选项卡页之间移动它们。我如何选择多个控件以便能够使用ctrl键+鼠标单击来移动它们?
到目前为止,这是我的拖动事件:
private void control_DragDrop(object sender, DragEventArgs e)
{
Control target = new Control();
target.Parent = sender as Control;
if (target != null)
{
int targetIndex = FindCSTIndex(target.Parent);
if (targetIndex != -1)
{
string cst_ctrl = typeof(CustomControl).FullName;
if (e.Data.GetDataPresent(cst_ctrl))
{
Button source = new Button();
source.Parent = e.Data.GetData(cst_ctrl) as CustomControl;
if (targetIndex != -1)
fl_panel = (FlowLayoutPanel)tabControl1.SelectedTab.Controls[0];
if (source.Parent.Parent.Name == target.Parent.Parent.Parent.Name)
{
this.fl_panel.Controls.SetChildIndex(source.Parent, targetIndex);
}
else
{
target.Parent.Parent.Parent.Controls.Add(source.Parent);
this.fl_panel.Controls.SetChildIndex(source.Parent, targetIndex);
}
}
}
}
}
private int FindCSTIndex(Control cst_ctr)
{
fl_panel = (FlowLayoutPanel)tabControl1.SelectedTab.Controls[0];
for (int i = 0; i < this.fl_panel.Controls.Count; i++)
{
CustomControl target = this.fl_panel.Controls[i] as CustomControl;
if (cst_ctr.Parent == target)
return i;
}
return -1;
}
这不是一件容易的事,也不是常见的任务。 但是,确实可行且取决于前提条件的方法可能变得微不足道,而无需花很多年的精力在上面^^。
您有很多选择:
处理选择非常容易:拥有字典(或控件属性,可能使用Tag
)来存储是否选择控件,以Ctrl方式单击反转选择时,以某种方式显示选择。 您甚至可以提供Shift键选择。
正如@Hans Passant所评论的那样,您可以使用覆盖窗口(位于所有内容顶部的不可见窗口)在此处绘制选择标线以及处理选择并拖动自身。 或者它可以是具有属性IsSelected
,该设置将绘制某些内容(边框?)以指示选择。
最简单的选择是创建SelectionPanel
控件,该控件可以承载内部的任何其他控件,具有IsSelected
指示并且可拖动。 添加子项后,请订阅MouseUp
/ MouseDown
事件,或者仅在单击SelectionPanel
特殊区域时才允许拖动。 例如,您可以在软件中选择“ 启用拖动” ,设置后,所有SelectionPanel
都会显示特殊区域(标题?),您可以拖动或按Ctrl键并单击。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.