在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 上使用默认值来实现的方法。您还需要将 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

}