在c#中设置自定义控件的默认值size/text
Setting default size/text of custom control in c#
我正在我的 C# 应用程序中创建自定义控件,以便添加新的 属性(下面的 MyProperty)。它继承自标签。我希望它做的一件事是,当我将它拖到我的表单 (200x132) 上时以特定大小显示。我也希望它不显示任何文字。但是,无论我如何尝试这样做,它似乎都不起作用。但是,我可以毫无问题地设置 BackColor 和 BorderStyle。我是 C# 的新手,所以我可能遗漏了一些明显的东西。
这是我的代码:
using System.Drawing;
using System.Windows.Forms;
namespace MyProgram
{
public enum MyEnum
{
Value1, Value2, Value3
}
public partial class MyControl : Label
{
public MyControl()
{
BackColor = Color.LightCoral;
BorderStyle = BorderStyle.FixedSingle;
AutoSize = false;
Size = new Size(200, 132);
Text = "";
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
}
private MyEnum myProperty;
public MyEnum MyProperty
{
get { return myProperty; }
set { myPropery = value; }
}
}
}
@Dispersia 回复只回答了 myControl1
的问题。 (同时删除)
这里有一份完整解决您问题的指南:
- 添加一个名为
MyLabel
的新 UserControl
- 在设计器模式中更改以下内容:
BorderStyle
:=FixedSingle
Size
:=200; 132
- 现在将新的
Label
拖放到控件上
- 编辑这些
Label
值(也在设计器模式中):
AutoSize
:= false
BackColor
:= LightCoral
Dock
:= Fill
Text
:= clear/empty this box!!
(这个不要写在方框里面,真的要清空!)
TextAlign
:=MiddleCenter
只需重新编译您的项目 && 从工具栏添加一个 MyLabel
控件。
现在它如你所愿地出现了!!
在我看来,通过 Dispersia 的 link 提供的答案有一个错误。文本重置应该发生一次,之后用户所做的任何事情都无关紧要。在 Dispersia 的 link 中,您实际上无法将文本设置回控件名称,因为它会一直空白。
cramopy 提供的答案在技术上并没有回答您的问题,但它是一种通过在 UserControl
上使用默认值来实现的方法。您还需要将 UserControl
的 Text
属性 绑定到标签的
从 Label
继承时,以下内容应该可以工作,并且只会重置 Text
属性 一次。
public partial class MyControl : Label
{
#region fields
private IComponentChangeService _changeService;
private bool canResetText = false;
#endregion
#region properties
protected override Size DefaultSize
{
get { return new Size(200, 132); }
}
[Browsable(false)]
public override bool AutoSize
{
get { return false; }
set { base.AutoSize = false; }
}
public override ISite Site
{
get { return base.Site; }
set
{
base.Site = value;
if (!base.DesignMode)
return;
this._changeService = (IComponentChangeService)base.GetService(typeof(IComponentChangeService));
if (this._changeService != null)
this._changeService.ComponentChanged += new ComponentChangedEventHandler(this.OnComponentChanged);
}
}
#endregion
#region constructors
public MyControl()
{
base.BackColor = Color.LightCoral;
base.BorderStyle = BorderStyle.FixedSingle;
}
#endregion
#region methods
protected override void InitLayout()
{
base.InitLayout();
this.canResetText = true;
}
private void OnComponentChanged(object sender, ComponentChangedEventArgs ce)
{
if (ce.Component != null &&
ce.Component == this &&
ce.Member.Name == "Text" &&
base.DesignMode &&
this.canResetText)
{
((MyControl)ce.Component).Text = string.Empty;
this.canResetText = false;
if (this._changeService != null)
this._changeService.ComponentChanged -= new ComponentChangedEventHandler(this.OnComponentChanged);
}
}
#endregion
}
我正在我的 C# 应用程序中创建自定义控件,以便添加新的 属性(下面的 MyProperty)。它继承自标签。我希望它做的一件事是,当我将它拖到我的表单 (200x132) 上时以特定大小显示。我也希望它不显示任何文字。但是,无论我如何尝试这样做,它似乎都不起作用。但是,我可以毫无问题地设置 BackColor 和 BorderStyle。我是 C# 的新手,所以我可能遗漏了一些明显的东西。
这是我的代码:
using System.Drawing;
using System.Windows.Forms;
namespace MyProgram
{
public enum MyEnum
{
Value1, Value2, Value3
}
public partial class MyControl : Label
{
public MyControl()
{
BackColor = Color.LightCoral;
BorderStyle = BorderStyle.FixedSingle;
AutoSize = false;
Size = new Size(200, 132);
Text = "";
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
}
private MyEnum myProperty;
public MyEnum MyProperty
{
get { return myProperty; }
set { myPropery = value; }
}
}
}
@Dispersia 回复只回答了 myControl1
的问题。 (同时删除)
这里有一份完整解决您问题的指南:
- 添加一个名为
MyLabel
的新 - 在设计器模式中更改以下内容:
BorderStyle
:=FixedSingle
Size
:=200; 132
- 现在将新的
Label
拖放到控件上 - 编辑这些
Label
值(也在设计器模式中):AutoSize
:=false
BackColor
:=LightCoral
Dock
:=Fill
Text
:=clear/empty this box!!
(这个不要写在方框里面,真的要清空!)TextAlign
:=MiddleCenter
UserControl
只需重新编译您的项目 && 从工具栏添加一个 MyLabel
控件。
现在它如你所愿地出现了!!
在我看来,通过 Dispersia 的 link 提供的答案有一个错误。文本重置应该发生一次,之后用户所做的任何事情都无关紧要。在 Dispersia 的 link 中,您实际上无法将文本设置回控件名称,因为它会一直空白。
cramopy 提供的答案在技术上并没有回答您的问题,但它是一种通过在 UserControl
上使用默认值来实现的方法。您还需要将 UserControl
的 Text
属性 绑定到标签的
从 Label
继承时,以下内容应该可以工作,并且只会重置 Text
属性 一次。
public partial class MyControl : Label
{
#region fields
private IComponentChangeService _changeService;
private bool canResetText = false;
#endregion
#region properties
protected override Size DefaultSize
{
get { return new Size(200, 132); }
}
[Browsable(false)]
public override bool AutoSize
{
get { return false; }
set { base.AutoSize = false; }
}
public override ISite Site
{
get { return base.Site; }
set
{
base.Site = value;
if (!base.DesignMode)
return;
this._changeService = (IComponentChangeService)base.GetService(typeof(IComponentChangeService));
if (this._changeService != null)
this._changeService.ComponentChanged += new ComponentChangedEventHandler(this.OnComponentChanged);
}
}
#endregion
#region constructors
public MyControl()
{
base.BackColor = Color.LightCoral;
base.BorderStyle = BorderStyle.FixedSingle;
}
#endregion
#region methods
protected override void InitLayout()
{
base.InitLayout();
this.canResetText = true;
}
private void OnComponentChanged(object sender, ComponentChangedEventArgs ce)
{
if (ce.Component != null &&
ce.Component == this &&
ce.Member.Name == "Text" &&
base.DesignMode &&
this.canResetText)
{
((MyControl)ce.Component).Text = string.Empty;
this.canResetText = false;
if (this._changeService != null)
this._changeService.ComponentChanged -= new ComponentChangedEventHandler(this.OnComponentChanged);
}
}
#endregion
}