如何使用ctrl键+鼠标单击来选择多个控件
本文关键字:选择 控件 单击 鼠标 何使用 ctrl | 更新日期: 2023-09-27 18:04:06
可能这个问题已经有答案了,但我没能找到它。我有一个tabControl与flowlayoutpanel在每个选项卡页面,我可以在运行时添加控件。我可以重新排列它们,在标签页之间移动它们。我如何选择多个控件,以便能够使用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-key选择。
正如@Hans Passant评论的那样,你可以使用覆盖窗口(所有东西上面的不可见窗口)在那里绘制选择线,以及处理选择和拖动自己。或者它可以是一个带有IsSelected
属性的自定义控件,设置它将绘制一些东西(边框?)来指示选择。
最简单的选择是创建SelectionPanel
控件,它可以在内部托管任何其他控件,具有IsSelected
指示并且可拖动。当添加孩子时,订阅MouseUp
/MouseDown
事件,或者如果单击SelectionPanel
的特殊区域,则只能允许拖动。例如,你可以有选项在你的软件中启用拖动,当设置所有的SelectionPanel
将显示特殊区域(头?),你可以拖动或Ctrl-click。