如何使用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;
    }

如何使用ctrl键+鼠标单击来选择多个控件

这不是一个简单的任务,也不是一个常见的任务。但可以肯定的是,可行的,取决于先决条件,可以变得微不足道,而不需要花费许多人年的努力^^。

你有很多选择:

  • 控件支持选择;
  • 容器控件支持子控件选择;
  • 覆盖。

处理选择非常容易:有一个字典(或控件属性,可能使用Tag)来存储是否选择控件,以某种方式显示选择,当控件Ctrl单击反转选择。您甚至可以提供Shift-key选择。

正如@Hans Passant评论的那样,你可以使用覆盖窗口(所有东西上面的不可见窗口)在那里绘制选择线,以及处理选择和拖动自己。或者它可以是一个带有IsSelected属性的自定义控件,设置它将绘制一些东西(边框?)来指示选择。

最简单的选择是创建SelectionPanel控件,它可以在内部托管任何其他控件,具有IsSelected指示并且可拖动。当添加孩子时,订阅MouseUp/MouseDown事件,或者如果单击SelectionPanel的特殊区域,则只能允许拖动。例如,你可以有选项在你的软件中启用拖动,当设置所有的SelectionPanel将显示特殊区域(头?),你可以拖动或Ctrl-click。