这个问题可能已经有了答案,但我无法找到它。 我在每个标签页中都有一个带有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;
}
答案 0 :(得分:0)
这不是一件容易的事情,也不是一项常见的任务。但肯定是可行的,取决于前提条件可能变得微不足道,而不需要花费多年的努力^^。
您有很多选择:
处理选择非常简单:如果选择了控件,是否有字典(或控件属性,可能使用Tag
)存储,以某种方式显示选择,当控件为 Ctrl 时 - 单击反转选择。您甚至可以提供 Shift -key选择。
正如@Hans Passant评论的那样,您可以使用叠加窗口(在所有内容的顶部隐藏窗口)在那里绘制选择标线以及处理选择和拖动自身。或者它可以是具有属性IsSelected
的自定义控件,设置将绘制某些内容(边框?)以指示选择。
最简单的选择是创建SelectionPanel
控件,它可以托管其中的任何其他控件,具有IsSelected
指示并且可拖动。添加子项时,订阅MouseUp
/ MouseDown
个事件,或者只有在点击SelectionPanel
的特殊区域时才允许拖动。例如,您可以在软件中选择启用拖动,设置后所有SelectionPanel
将显示可以拖动的特殊区域(标题?)或 Ctrl -Click。