2012-01-28 15 views
11

我想報告用C#編寫的WinForm應用程序中的操作狀態。 爲了使它更加用戶友好,我想根據狀態在左邊顯示一個圖標。在左側標有圖片 - 防止文字過來?

  • 根據結果過程
  • 正常或錯誤圖標期間動畫GIF。

我想使用原生的WinForms Label控件,它可以很好地處理動畫GIF並且看起來像標準一樣。

然而,我的問題是,文字來寫在圖片上。 似乎沒有任何屬性可以爲文本設置頁邊距。 我試過最明顯的事情,就是用空格作爲前綴,除非文本換行到下一行,如下所示。

enter image description here

我不想花太多時間寫/測試/調試衍生的控制這一點,如果可能的... 我可以把一個快速和骯髒的用戶控件,用一個圖片上左邊一個標籤,但它不覺得很乾淨。

有沒有什麼竅門可以快速而優雅地避開這個問題呢,還是有人能指點我一個Label派生類來支持這個相對輕量級的類? (我看了一下CodeProject,但找不到太多東西)。

謝謝。

回答

7

帶圖像和單獨標籤的快速和骯髒的用戶控制是您的最佳選擇。只需添加一個公共字符串屬性來設置標籤的文本,你就完成了。

-10
nameoftextlabel.hidden=1 

這應該有效。

+6

1)'hidden'不是一個有效的屬性; 2)'1'不是有效的布爾值; 3)隱藏標籤將無濟於事 – 2013-07-03 23:50:30

20

一個簡單的替代方法是使用一個Button代替Label,如下圖所示:

通過下面的屬性,你可以風格的Button看起來就像一個Label,同時也具有選擇下一個對準的圖像和文本保持海誓山盟:

FlatAppearance ↴ 
    BorderSize   = 0 
    MouseDownBackColor = Control 
    MouseOverBackColor = Control 
FlatStyle   = Flat 
Image    = [Your image] 
ImageAlign   = MiddleLeft 
Text     = [Your text] 
TextAlign   = MiddleLeft 
TextImageRelation = ImageBeforeText 

一種簡單的方式來實現所期望的效果;沒有用戶控制!

+0

聰明的想法,雖然在我的情況下,我仍然可以點擊它,然後按下按鈕。將Enabled設置爲false使其看起來不同(圖像變灰,gif動畫停止)。 – 2013-07-16 13:37:16

+0

@KharlosDominguez這很奇怪,我設法讓它看起來很完美。我稍後再看看它,並報告回來! – 2013-07-16 19:54:44

+1

@KharlosDominguez我不認爲你將'FlatAppearance'→'MouseDownBackColor'設置爲'Control'(或你的背景顏色)。這是我可以做的複製你所說的內容的唯一方法。 – 2013-07-17 05:20:41

0

一種替代一個UserControl將是使用一個TableLayoutPanel具有兩列和一個行,放置在一個小區中的圖像控制,並在其他的文本控制。

0

一個老問題,但也許有人會看這裏就像我來到這裏......

您可以對圖像和文字使用對齊:

label.TextAlign = ContentAlignment.MiddleRight; 
label.ImageAlign = ContentAlignment.MiddleLeft; 
+0

不正確。根據控件的大小,您的解決方案仍然可以將文本與圖像重疊。它也確實解決了這個問題。你實際上試圖讓它們彼此遠離 – 2015-08-10 18:12:43

+0

它對我來說很有效...... – 2015-08-11 20:17:09

+1

它的作用是因爲你的標籤文字大小和圖像大小足夠小。如果您試圖縮小標籤,它們會重疊。在某些情況下,如果您不調整控件大小或更改標籤文本,則可以接受您的解決方案。但是你沒有解決這個問題(嘗試使用多行文本工作,如問題中所示) – 2015-08-17 13:28:09

2

這裏有一個不同我發現這個解決方案比「風格化按鈕」方法更簡單。它還允許您設置圖像和文本之間的距離(間距)。

class ImageLabel : Label 
{ 
    public ImageLabel() 
    { 
     ImageAlign = ContentAlignment.MiddleLeft; 
    } 

    private Image _image; 
    public new Image Image 
    { 
     get { return _image; } 

     set 
     { 
      const int spacing = 4; 

      if (_image != null) 
       Padding = new Padding(Padding.Left - spacing - _image.Width, Padding.Top, Padding.Right, Padding.Bottom); 

      if (value != null) 
       Padding = new Padding(Padding.Left + spacing + value.Width, Padding.Top, Padding.Right, Padding.Bottom); 

      _image = value; 
     } 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     if (Image != null) 
     { 
      Rectangle r = CalcImageRenderBounds(Image, ClientRectangle, ImageAlign); 
      e.Graphics.DrawImage(Image, r); 
     } 

     base.OnPaint(e); // Paint text 
    } 
}