UserControl扩展ScrollableControl - 禁用容器功能

时间:2017-04-05 11:42:57

标签: c# .net winforms user-controls

我正在通过扩展ScrollableControl来构建自定义控件 问题是我的自定义控件充当容器 - 我可以将控件拖入其中: enter image description here

我的问题是如何在扩展ScrollableControl

的类中禁用容器功能

以下是两个测试控件,一个扩展Control,第二个ScrollableControl

public class ControlBasedControl : Control
{
    protected override Size DefaultSize
    {
        get { return new Size(100, 100); }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        e.Graphics.FillRectangle(Brushes.LightCoral, ClientRectangle);
    }
}

public class ScrollableControlBasedControl : ScrollableControl
{
    public ScrollableControlBasedControl()
    {
        AutoScrollMinSize = new Size(200, 200);
    }

    protected override Size DefaultSize
    {
        get { return new Size(100, 100); }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        e.Graphics.FillRectangle(Brushes.LawnGreen, ClientRectangle);
    }
}

2 个答案:

答案 0 :(得分:1)

您在设计时从[Designer]属性获得“类似于容器的行为”行为。从Reference Source

复制粘贴
[
ComVisible(true),
ClassInterface(ClassInterfaceType.AutoDispatch),
Designer("System.Windows.Forms.Design.ScrollableControlDesigner, " + AssemblyRef.SystemDesign)
]
public class ScrollableControl : Control, IArrangedElement {
   // etc...
}

ScrollableControlDesigner可以完成工作。单独做得不多,但是从ParentControlDesigner派生,设计器允许控件充当子控件的父级,并在设计时赋予它类似容器的行为。

修复很简单,您只需使用自己的[Designer]属性来选择其他设计器。添加对System.Design的引用,使其如下所示:

using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;
using System.Windows.Forms.Design; // Add reference to System.Design

[Designer(typeof(ControlDesigner))]
public class ScrollableControlBasedControl : ScrollableControl {
    // etc...
}

答案 1 :(得分:0)

实现这一目标的方法可能不止一种,但这就是我要做的......

首先创建ControlCollection的只读版本

public class ReadOnlyControlCollection : Control.ControlCollection
{
    public ReadOnlyControlCollection(Control owner)
        : base(owner)
    {
    }

    public override bool IsReadOnly
    {
        get { return true; }
    }

    public override void Add(Control control)
    {
        throw new ArgumentException("control");
    }
}

然后让ScrollableControlBasedControl创建一个ReadOnlyControlCollection的实例,而不是默认的ControlCollection

public class ScrollableControlBasedControl : ScrollableControl
{
    protected override Control.ControlCollection CreateControlsInstance()
    {
        return new ReadOnlyControlCollection(this);
    }

    // The rest of your class goes here...
}

我使用Visual Studio 2010,当我在ScrollableControlBasedControl上放置一个控件时,控件会神奇地移回原来的位置,就像操作被取消一样。