2011-08-11 50 views
8

我注意到,在將wpf中的文本框選擇設置爲紅色並使用顏色選擇器驗證顏色時,顏色淡化爲#FF9999。計算WPF中的選擇筆刷顏色

我有一個特定的顏色,我的客戶需要選擇畫筆。有沒有一種方法可以計算出什麼顏色我應該設置SelectionBrush,所以當文本被選中時,確切的顏色顯示?

目前我需要選擇畫筆爲#6599D1,但一旦設置,顏色是#C1D6ED。

如何計算起始顏色,使最終顏色成爲我需要的顏色?

+1

你能不能給你用來設置顏色的代碼? – Jakub

+0

我懷疑你的顏色是半透明的,你需要使它不透明。沒有看到你如何改變顏色,我沒有一個簡單的方法來提出更多的建議。 –

+0

如果您嘗試執行高度自定義樣式,但是我傾向於保留系統默認顏色,並且在創建自定義控件時從相似的上下文中借用系統默認顏色,則無助於此。這有助於與Window的可訪問模式兼容,並且使用戶可以使用窗口的主題功能,而不會引起令人討厭的視覺衝突。 –

回答

2

好問題,但我認爲這是不可能的。如果ControlTemplate內有一些覆蓋層,則無法制定計算較暗顏色的函數,然後顏色會以預期顏色結束。

例如當你輸入的是:255,0,0你得到了255,153,153,現在需要應用到你的初始顏色的函數需要使紅色變暗,這當然只能在紅色通道中完成,因爲綠色和藍色已經爲零。但問題不在於紅色通道(最終結果爲255,因此不受影響),因此對其進行的任何更改只會使顏色變得更飽和而不是變暗。

編輯:爲了使這個更工科數學一點,即由選擇的透明度施加的函數是:

F(X)= 0.4X + 153

如果您將此應用於您的顏色的所有通道,您將會看到確實如此。現在我們如何獲得我們想要的價值?很簡單,我們反轉的功能,這是這樣的:

˚F^( - 1)(X)= -2.5(153.0 - X)

太好了!現在,讓我們應用,爲您的色彩:

R:-130.0
G:0
B:140

嗯,畢竟沒有那麼大我猜想。

這個負值恰恰是爲什麼這不總是可能的,每個顏色的組成部分低於153是不可逆的。

3

跟進答案通過H.B.

我已經在過去

Red = OriginalRed * Opacity + (1-Opacity) * BackgroundRed 

其反轉爲

(Red - (1-Opacity) * BackgroundRed)/Opacity = OriginalRed 

TextBox有默認Background集計算不透明以下公式白色和SelectionOpacity設置爲0.4。
作爲H.B.解釋說,你不能使用這些默認設置來實現你的顏色,因爲紅色值將以-130的值出現。這使你有3個選項,更改Background,改變SelectionOpacity或者不這樣做:)

改變TextBox Background可能不是你想做的事讓葉選項2的東西,改變SelectionOpacity

我們不」不想紅去低於0,以便

(101 - (1-Opacity) * 255) = 0 

這給

1 - (101/255) = Opacity 

這導致0604小號o通過這個SelectionOpacity值,您可以計算出SelectionBrush需要設置爲#0056B3,一旦應用了不透明度,就會變爲#6599D1

這裏是如何的TextBox外觀與這些值

<TextBox SelectionBrush="#0056B3" 
     SelectionOpacity="0.604" /> 

enter image description here

+0

有趣的想法,但文本承認確實會變得不那麼可讀性在如此高的價值。 –

+0

@HB:確實如此,整個'TextBox'看起來有點失真或模糊的圖像(在應用程序中稍微好一點),但是,它肯定難以閱讀 –

+0

Nevermind my last comment ..它看起來在我的Windows 7電腦模糊,但從另一臺電腦,它看起來很清晰... –