我不确定这是否可行。我做了一些研究,但未能找到任何结论。有一个类似的问题here,但它适用于WPF。
我想要做的是将自定义属性添加到表单上的现有WinForms GroupBox(或任何控件)。对于此示例,我们将使用“链接”。假设我程序中的每个GroupBox都包含一个超链接,那么当我启动程序时我需要做的就是这样做:
MyGroupBox.Link = "http:\\www.google.com\"
稍后在我的程序中,我可以设置我的超链接内容以引用MyGroupBox.Link
。
是否可以像这样操纵Winforms控件?如果我不需要,我宁愿不进行自定义控制。
我从this question看到我可以扩展我的控制权,但在我的具体情况下我会如何看待?这与创建自定义控件相同吗?
答案 0 :(得分:6)
我没有尝试使用GroupBox,但我认为你可以在这里使用Button做类似的例子。
http://msdn.microsoft.com/en-us/library/7h62478z(v=vs.90).aspx
只需创建一个新类,称之为MyGroupBox或任何你想要的:
public class MyGroupBox : GroupBox {
private string link;
public string Link {get {return link;} set{link=value;} }
}
这将继承GroupBox中的所有行为/属性,并为Link添加新属性。
然后你可以这样使用它:
MyGroupBox groupBox = new MyGroupBox();
groupBox.Link = "www.google.com";
我认为这比使用tag属性更清晰,老实说。主要是因为它不是标签,它是一个链接,我喜欢能够恰当地命名该属性。 :)虽然如果您需要为许多控件而不仅仅是GroupBox执行此操作,标记可能会更容易。
答案 1 :(得分:6)
一种方法是使用Extender Providers。当它添加到表单时,它就像ToolTip组件一样,它为该表单上的每个控件提供了一个名为ToolTip的属性。你可以创建这个类:
[ProvideProperty("Link", typeof(Control))]
public class ExtendControls : Component, IExtenderProvider
{
private Dictionary<Control, string> links =
new Dictionary<Control, string>();
public bool CanExtend(object extendee)
{
return !(extendee is Form);
}
public void SetLink(Control extendee, string value)
{
if (value.Length == 0)
{
links.Remove(extendee);
}
else
{
links[extendee] = value;
}
}
[DisplayName("Link")]
[ExtenderProvidedProperty()]
public string GetLink(Control extendee)
{
if (links.ContainsKey(extendee))
{
return links[extendee];
}
else
{
return string.Empty;
}
}
}
它的作用是为所有控件提供Link属性来处理表单。现在你在windowsforms项目中创建这个类并构建它,在你去工具箱中的表单设计器后你应该看到extendcontrols组件将其拖到窗体上,它将被放置在组件托盘中。几乎完成...接下来,您可以在所需控件的属性窗口中或在此类代码中使用新的链接属性(假设您已离开组件至其默认名称):
//assuming ofcourse you have a button called button1
//i used button as the example you can use panel,datagridview,label,etc...
//to set it...
extendControls1.SetLink(button1, "sometest");
//to get it back...
string myLink = extendControls1.GetLink(button1);
答案 2 :(得分:0)
为了回应Savanna,您可以使用Savanna描述的方法创建扩展类,然后将实际类拖到工具箱中。奇怪的是,你可以在你的工具箱中拥有它,准备好在设计师模式下拖动到你的表单,完成你添加的任何自定义属性。