在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; }
        }
    }
}

在c#中设置自定义控件的默认大小/文本

在我看来,通过Dispersia的链接提供的答案有一个错误。文本重置应该发生一次,然后用户在那之后做什么都不重要。在Dispersia的链接中,您实际上无法将文本设置回控件名称,因为它会不断将其清空。

cramopy提供的答案在技术上并不能回答您的问题,不过这是一种通过在UserControl上使用默认值来解决问题的方法。您还需要将UserControlText属性绑定到标签。

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控件
现在它出现在你想要的地方!!