拒絕單色調,重寫Label控制項

2022-01-29 12:07:08 字數 1984 閱讀 5295

在winform中,微軟提供的label中文字只能是一種顏色:要麼全是黑色,要麼全是紅色或者其它顏色。當我們為了強調某些文字,讓它用紅色顯示時只能新建乙個lable物件,設定它fontcolor為紅色。但是如果在一行文字內嵌三個紅色,那豈不是要拼接六個label控制項?坑爹啊,這麼麻煩,我們還不如自己重寫一下label控制項,讓它支援多顏色的文字呢。

ok。let's do it.

要讓不同的文字顯示不同的顯示,我們必須告訴label控制項哪些文字對應哪種顏色。在這裡,我們定義乙個字典來儲存。

///

///keyvaluepair中 string儲存文字,color為對應的顏色

/// private dictionary> strcolordic = new dictionary>();

設定對應的公共屬性:

public dictionary>strcolordic

set

}

接下來就是最重要的重寫onpaint事件了。在這裡如果我們定義的strcolordic中有值,就用g.drawstring將strcolordic中的文字寫到label控制項上。如果strcolordic中沒有值,就呼叫base.onpaint(e)將text屬性中的文字寫到label控制項上。

注意繪製時起點的x軸要作相應的變動。

///

///重寫onpaint,如果strcolordic不為空,就將strcolordic中文字

///繪製到label中

/// ///

protected

override

void

onpaint(painteventargs e)

}else

if(this.text!=""

)

}

大功告成,很簡單吧。我們新建乙個winform窗體來測試一下。在form1_load中新增下面**:

dictionary> dic = new dictionary>();

dic.add("1

",new keyvaluepair("

我是紅色

",color.red));

dic.add("2

", new keyvaluepair("

我是藍色

", color.blue));

dic.add("3

", new keyvaluepair("

我是黃色

", color.yellow));

this.mylabel1.strcolordic = dic;

可以看到執行效果:

不過還有乙個bug,如果this.mylabel1.text(mylabel1即為我們的自定義控制項)的值為空的話,它不會觸發我們重寫的onpaint事件。我們在**中給它賦的值也就顯示不出來。

其實我們可以在給mylabel1賦dic時隨便給mylabel1.text賦個值就行了,如:

dictionary> dic = new dictionary>();

dic.add("1

", new keyvaluepair("

我是紅色

", color.red));

dic.add("2

", new keyvaluepair("

我是藍色

", color.blue));

dic.add("3

", new keyvaluepair("

我是黃色

", color.yellow));

不能為空,否則無法觸發 onpaint事件

this.mylabel1.text = "";

this.mylabel1.strcolordic = dic;