我不喜欢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的标记和Underscore存在一些问题,但是很容易遵循代码)。


实际上,当我看到它无法正常工作时,我已经删除了那个覆盖。 我现在再添加它并测试。 基本上我想用一些名为IWillNotAutoSizeLabel的新标签替换Label;)

我基本上讨厌autosize属性“on default”。

===============>>#1 票数:3 已采纳

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

我注意到你已经覆盖了OnLoad方法。 你试过在那里设置AutoSize = false吗? 或者您主要关注提供默认值false?

===============>>#2 票数: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 票数:1

您的问题可能是您实际上没有在代码中覆盖自动调整大小(即,与覆盖Font或ForeColor的方式相同)。

===============>>#4 票数:0

我没有在构造函数中看到this.AutoSize = false 您的类被标记为部分 - 也许您在该行的另一个文件中有一个构造函数。 视觉工作室设计师将调用你所在的无参数构造函数。

  ask by Martin Marconcini translate from so

未解决问题?本站智能推荐:

2回复

使用C#.NET 3.5 WinForms是否部分透明?

我正在制作具有绘制部分透明的黑色背景的窗体的.NET 3.5应用程序。 我重写OnPaintBackground来完成此任务: 它可以工作,但有时表单会在其自身上绘制而不会清除屏幕,从而使透明度比应有的要暗。 我尝试过使用Graphics.Flush()和Graphics.Clear
5回复

在c#.net winforms中保存变量的值

我有一个具有按钮的表单,在按钮单击事件上,变量locklogin增加1 当locklogin = 3时,表单按钮被禁用,表单需要关闭。 在关闭表单时,locklogin失去了它的价值。 但我希望保持其价值,虽然表格被关闭,当表格再次运行(整个应用程序再次执行),然后按钮仍然被禁用。
2回复

c#.net中的气球类为winforms

使用winforms在c#.net中是否有气球类?
1回复

打开Winforms C#.net时发生异常

我已经在C#.net和实体框架中开发了Windows应用程序,数据库是oracle。 我已成功将此应用程序部署在服务器计算机上,并且应用程序运行良好。 当在客户端计算机上访问此应用程序时,与db的连接正常工作,但是在尝试打开表单时会引发异常- “在配置中找不到指定的存储提供程序,或
2回复

C#.net Winforms数据插入错误

您好专家,我正在使用C#创建Windows窗体应用程序,我试图将数据插入数据库中,但是即使输入了正确的属性值,也出现了值错误和列不匹配的错误。 我有8个属性(具有自动递增的ID),对于其余7列,我正在输入7个值,但出现值不匹配的错误。 请帮我解决这个问题。 我已附上问题的代码和屏
3回复

WinForms C#.Net 4.0中的功能区

Microsoft是否为非Office应用程序提供了功能区控件? 如果没有,有没有免费的? 我喜欢该组件,并希望使用它我的WinForm 4.0应用程序。
1回复

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

我从DateEdit获取日期,并尝试存储到Access数据库中。 但是它显示这样的错误 Syntax error in INSERT INTO statement. 我的插入语句是这个 除日期剩余值成功存储外,如何存储日期? 我得到这样的DateTime date =
2回复

ConnectionString属性尚未初始化。 Winforms C#.net

我正在向已经建立的Winforms应用程序添加新表单。 我的表单上有一个DataGridView,后面的代码中的相关方法调用我的dbAPI DataTable方法。 我用与dbAPI类中使用的其他代码完全相同的代码编写了该方法但由于某种原因它没有初始化连接字符串... _conn
1回复

此C#.NET WinForms应用程序在做什么?

我正在尝试编辑Access DB_。 由于某种原因,我无法插入任何内容。 我相信我的代码是正确的。 连接字符串是正确的(尽管出于安全考虑,我为这篇文章添加了一个假冒的字符串)。 最后,我没有获得像在函数末尾那样的MessageBox 。 也不向Access DB添加任何内容。 有
2回复

显示和隐藏winforms的一部分(扩展?)C#.NET

我对表格和控件有疑问。 我想添加一种使仅在单击某些内容时才显示为表单一部分的功能。 例如,我有form1,在表单上,​​我有一个按钮,当单击该按钮时,表单会增长或扩展(滑出?),以显示在单击按钮之前不存在的其他控件。 我不知道这叫什么,所以我不知道要寻找什么,但是我已经看到它在许多其他应用