在c#中设置自定义控件的默认大小/文本
本文关键字:默认大小 文本 自定义控件 设置 | 更新日期: 2023-09-27 18:26:52
我正在C#应用程序中创建一个自定义控件,以便添加一个新属性(下面是MyProperty)。它继承自Label。我想让它做的一件事是,当我把它拖到我的窗体(200x132)上时,以特定的大小显示。我也希望它不显示文本。然而,无论我如何尝试,它似乎都不起作用。然而,我可以毫无问题地设置背景色和边框样式。我对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的链接提供的答案有一个错误。文本重置应该发生一次,然后用户在那之后做什么都不重要。在Dispersia的链接中,您实际上无法将文本设置回控件名称,因为它会不断将其清空。
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
}
@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
控件
现在它出现在你想要的地方!!