【问题标题】:How to use ctrl key + mouse click to select multiple controls?如何使用 ctrl 键 + 鼠标单击来选择多个控件?
【发布时间】:2014-07-08 08:33:05
【问题描述】:

可能这个问题在这里已经有了答案,但我没能找到它.. 我在每个标签页中有一个带有 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;
    }

【问题讨论】:

  • 这是 Visual Studio 中内置的设计器的一项功能。在运行时对此没有任何支持,表单的设计器视图与覆盖窗口完全不同,它可以执行诸如显示选择矩形之类的操作。仅仅点击一个控件就已经让你头疼了,这当然会触发控件的 MouseDown 事件。 VS 设计器是一项多年的努力,而不是您将从 SO 问题开始的东西。自己利用设计师是covered here

标签: c# drag-and-drop keyboard keyboard-shortcuts


【解决方案1】:

这不是一件容易的事,也不是一项常见的任务。但肯定可行并且取决于先决条件可能变得微不足道,而无需花费数人年的努力^^。

你有很多选择:

  • 控件支持选择;
  • 容器控件支持子控件选择;
  • 叠加。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多