C#.NET Winforms:是不是可以覆盖 Label.Autosize?

Posted

技术标签:

【中文标题】C#.NET Winforms:是不是可以覆盖 Label.Autosize?【英文标题】:C#.NET Winforms: Is it possible to override Label.Autosize?C#.NET Winforms:是否可以覆盖 Label.Autosize? 【发布时间】:2010-09-06 17:08:48 【问题描述】:

我不喜欢 Label 控件的 AutoSize 属性。我有一个自定义标签,它在其他东西中绘制了一个精美的圆形边框。我在构造函数中放置了AutoSize = false,但是,当我将其置于设计模式时,该属性始终为 True。

我已经成功地覆盖了其他属性,但是这个很高兴地忽略了我。有人知道这是否是“由 MS 设计的”吗?

这是我的标签的完整源代码,以防有人感兴趣。

using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

namespace Dentactil.UI.WinControls

    [DefaultProperty("TextString")]
    [DefaultEvent("TextClick")]
    public partial class RoundedLabel : UserControl
    
        private static readonly Color DEFAULT_BORDER_COLOR = Color.FromArgb( 132, 100, 161 );
        private const float DEFAULT_BORDER_WIDTH = 2.0F;
        private const int DEFAULT_ROUNDED_WIDTH = 16;
        private const int DEFAULT_ROUNDED_HEIGHT = 12;

        private Color mBorderColor = DEFAULT_BORDER_COLOR;
        private float mBorderWidth = DEFAULT_BORDER_WIDTH;
        private int mRoundedWidth = DEFAULT_ROUNDED_WIDTH;
        private int mRoundedHeight = DEFAULT_ROUNDED_HEIGHT;

        public event EventHandler TextClick;

        private Padding mPadding = new Padding(8);

        public RoundedLabel()
        
            InitializeComponent();
        

        public Cursor TextCursor
        
            get  return lblText.Cursor; 
            set  lblText.Cursor = value; 
        

        public Padding TextPadding
        
            get  return mPadding; 
            set
            
                mPadding = value;
                UpdateInternalBounds();
            
        

        public ContentAlignment TextAlign
        
            get  return lblText.TextAlign; 
            set  lblText.TextAlign = value; 
        

        public string TextString
        
            get  return lblText.Text; 
            set  lblText.Text = value; 
        

        public override Font Font
        
            get  return base.Font; 
            set
            
                base.Font = value;
                lblText.Font = value;
            
        

        public override Color ForeColor
        
            get  return base.ForeColor; 
            set
            
                base.ForeColor = value;
                lblText.ForeColor = value;
            
        

        public Color BorderColor
        
            get  return mBorderColor; 
            set
            
                mBorderColor = value;
                Invalidate();
            
        

        [DefaultValue(DEFAULT_BORDER_WIDTH)]
        public float BorderWidth
        
            get  return mBorderWidth; 
            set
            
                mBorderWidth = value;
                Invalidate();
            
        

        [DefaultValue(DEFAULT_ROUNDED_WIDTH)]
        public int RoundedWidth
        
            get  return mRoundedWidth; 
            set
            
                mRoundedWidth = value;
                Invalidate();
            
        

        [DefaultValue(DEFAULT_ROUNDED_HEIGHT)]
        public int RoundedHeight
        
            get  return mRoundedHeight; 
            set
            
                mRoundedHeight = value;
                Invalidate();
            
        

        private void UpdateInternalBounds()
        
            lblText.Left = mPadding.Left;
            lblText.Top = mPadding.Top;

            int width = Width - mPadding.Right - mPadding.Left;
            lblText.Width = width > 0 ? width : 0;

            int heigth = Height - mPadding.Bottom - mPadding.Top;
            lblText.Height = heigth > 0 ? heigth : 0;
        

        protected override void OnLoad(EventArgs e)
        
            UpdateInternalBounds();
            base.OnLoad(e);
        

        protected override void OnPaint(PaintEventArgs e)
        
            SmoothingMode smoothingMode = e.Graphics.SmoothingMode;
            e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;

            int roundedWidth = RoundedWidth > (Width - 1)/2 ? (Width - 1)/2 : RoundedWidth;
            int roundedHeight = RoundedHeight > (Height - 1)/2 ? (Height - 1)/2 : RoundedHeight;

            GraphicsPath path = new GraphicsPath();
            path.AddLine(0, roundedHeight, 0, Height - 1 - roundedHeight);
            path.AddArc(new RectangleF(0, Height - 1 - 2*roundedHeight, 2*roundedWidth, 2*roundedHeight), 180, -90);
            path.AddLine(roundedWidth, Height - 1, Width - 1 - 2*roundedWidth, Height - 1);
            path.AddArc(new RectangleF(Width - 1 - 2*roundedWidth, Height - 1 - 2*roundedHeight, 2*roundedWidth, 2*roundedHeight), 90, -90);
            path.AddLine(Width - 1, Height - 1 - roundedHeight, Width - 1, roundedHeight);
            path.AddArc(new RectangleF(Width - 1 - 2*roundedWidth, 0, 2*roundedWidth, 2*roundedHeight), 0, -90);
            path.AddLine(Width - 1 - roundedWidth, 0, roundedWidth, 0);
            path.AddArc(new RectangleF(0, 0, 2*roundedWidth, 2*roundedHeight), -90, -90);

            e.Graphics.DrawPath(new Pen(new SolidBrush(BorderColor), BorderWidth), path);

            e.Graphics.SmoothingMode = smoothingMode;
            base.OnPaint(e);
        

        protected override void OnResize(EventArgs e)
        
            UpdateInternalBounds();
            base.OnResize(e);
        

        private void lblText_Click(object sender, EventArgs e)
        
            if (TextClick != null)
            
                TextClick(this, e);
            
        
    

(Stack Overflow 的标记和下划线存在一些问题,但很容易按照代码进行操作)。


实际上,当我看到它不起作用时,我实际上已经删除了该覆盖。我现在再次添加并测试。基本上我想用一些新标签替换标签:IWillNotAutoSizeLabel ;)

我基本上讨厌“默认开启”的 autosize 属性。

【问题讨论】:

【参考方案1】:

在表单本身的构造函数中设置控件的某些属性时,我看到了类似的行为。他们似乎恢复了设计时的默认设置。

我注意到您已经覆盖了 OnLoad 方法。您是否尝试在那里设置 AutoSize = false ?还是您主要关心提供 default false 值?

【讨论】:

【参考方案2】:

我花了很多时间,终于成功了! (我的代码是 vb.net 但转换起来很简单)

Private _Autosize As Boolean 

Public Sub New()
    _Autosize=False
End Sub

Public Overrides Property AutoSize() As Boolean
    Get
        Return MyBase.AutoSize
    End Get

    Set(ByVal Value As Boolean)
        If _Autosize <> Value And _Autosize = False Then
            MyBase.AutoSize = False
            _Autosize = Value
        Else
            MyBase.AutoSize = Value
        End If
    End Set
End Property

【讨论】:

【参考方案3】:

您的问题可能是您实际上并没有在代码中覆盖 Autosize(即,与覆盖 Font 或 ForeColor 的方式相同)。

【讨论】:

【参考方案4】:

我在您的构造函数中没有看到this.AutoSize = false。您的类被标记为部分 - 也许您在具有该行的另一个文件中有一个构造函数。 Visual Studio 设计器将调用您已获得的无参数构造函数。

【讨论】:

以上是关于C#.NET Winforms:是不是可以覆盖 Label.Autosize?的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 C++/CLI (.NET Winforms/WPF) 为用本机 C 和 C++ 编写的应用程序提供 GUI

INSERT INTO 语句 c#.net Winforms Devexpress 中的语法错误?

C# Winforms 选项卡控制选项卡宽度错误

c++ Winforms文本框错误

为啥我的 .Net/WinForms 应用程序仅在 Visual Studio 中获得跨线程异常? [复制]

C# WinForms 中的切换按钮