2008-08-24 28 views
4

LabelコントロールのAutoSizeプロパティが嫌いです。私は、他のものの中で鮮やかな丸みのある境界線を描くカスタムラベルを持っています。私はAutoSize = falseを私のコンストラクタに配置していますが、デザインモードにするとプロパティは常にTrueになります。C#.NET Winforms:Label.Autosizeをオーバーライドすることは可能ですか?

私は成功した他のプロパティをオーバーライドしましたが、これは私をうれしく無視しています。これは "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); 
      } 
     } 
    } 
} 

(スタックオーバーフローのマークアップとアンダースコアにいくつかの問題がありますが、コードに従うのは簡単です)。


実際には動作していないことがわかったとき、私は実際にそのオーバーライドを削除しました。もう一度追加してテストします。基本的に私はラベルをいくつかの新しいラベルで置き換えたい:IWillNotAutoSizeLabel;)

私は基本的にautosizeプロパティが嫌いです。

答えて

3

フォーム自体のコンストラクタのコントロールの特定のプロパティを設定すると、同様の現象が見られました。彼らは設計時のデフォルトに戻っているようです。

既にOnLoadメソッドをオーバーライドしていることに気付きました。そこにAutoSize = falseを設定しようとしましたか?または、主にのデフォルト値の値falseを指定することに関心がありますか?

+0

私はこのマットを試してみます。ありがとう。 –

1

あなたの問題は、コード内でAutosizeを実際にオーバーライドしていない可能性があります(つまり、FontやForeColorをオーバーライドするのと同じ方法で)。

0

コンストラクタ内にthis.AutoSize = 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 
関連する問題