我正在通过扩展ScrollableControl
来构建自定义控件
问题是我的自定义控件充当容器 - 我可以将控件拖入其中:
我的问题是如何在扩展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);
}
}
答案 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
上放置一个控件时,控件会神奇地移回原来的位置,就像操作被取消一样。