如何在自定义控件中启用设计支持?

29

我尝试解释一下我的需求。我不知道它的技术术语,所以我来说一下:

示例1: 如果我在窗体上放置一个ListView,并添加一些列,我可以在设计时点击并拖动这些列来调整它们的大小。

示例2: 现在,我将ListView放在一个用户控件中,并命名为“ MyCustomListView”(可能还添加了一些方法来增强它)。

如果我现在将“MyCustomListView”放在窗体上,我无法在设计时单击并拖动列标题来调整其大小。

是否有任何简单的方法使其发生?某种形式的“将单击和拖动事件传递给底层控件,让该控件展现其魔力”?我并不是真正想要重新编码,只是将鼠标单击(或其他什么)传递给在本例中的ListView,并让其反应如上面第一个示例中所做的那样。

1个回答

64
Windows Forms设计器为大多数控件提供了专门的设计器类。 ListView的设计器是System.Windows.Forms.Design.ListViewDesigner,它是System.Design.dll程序集中的内部类。该类使您能够拖动列头。

UserControl使用System.Windows.Forms.Design.ControlDesigner设计器类。 它不会做任何特殊的事情,只是在控件周围放置一个带有拖动手柄的矩形。您可以看到这将会导致什么:在您将用户控件放在窗体上之后,将使用ControlDesigner来设计该类,而ListViewDesigner不在画面中。因此,您失去了拖动列头的能力。还要注意的是,ControlDesigner不提供访问UC内控件的权限。

不过,通过创建自己的设计器,这些问题都可以解决。首先,从“项目”+“添加引用”开始,选择System.Design。您需要向UC添加一个公共属性以公开ListView,并应用[DesignerSerializationVisibility]属性以允许保存已更改的属性。并且将[Designer]属性应用于UC类以替换默认设计器。所有这些都应该类似于以下内容(使用默认名称和显示“employees”的ListView):

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Design;   // Note: add reference required: System.Design.dll

namespace WindowsFormsApplication1 {
    [Designer(typeof(MyDesigner))]   // Note: custom designer
    public partial class UserControl1 : UserControl {
        public UserControl1() {
            InitializeComponent();
        }

        // Note: property added
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public ListView Employees { get { return listView1; } }
    }

    // Note: custom designer class added
    class MyDesigner : ControlDesigner {
        public override void Initialize(IComponent comp) {
            base.Initialize(comp);
            var uc = (UserControl1)comp;
            EnableDesignMode(uc.Employees, "Employees");
        }
    }
}
用户控件中的列表视图现在可以像常规一样被点击和设计。

10
谢谢你的善良。很高兴你出现并教给我一些东西。 - Sky Sanders
7
那真是一个完美答案的完美例子 =) 谢谢! - Ted

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接