在WPF中计算选择画笔颜色

时间:2011-08-11 15:57:03

标签: wpf colors textbox brush

我注意到在将wpf中的文本框选择设置为红色时,并使用颜色选择器验证颜色,颜色渐渐变为#FF9999。

我有一个特定的颜色,我的客户需要选择画笔。有没有办法计算我应该将SelectionBrush设置为什么颜色,所以当选择文本时,会显示确切的颜色?

目前我需要将选择画笔设为#6599D1,但一旦设置,颜色为#C1D6ED。

如何计算起始颜色,以便最终颜色是我需要的?

2 个答案:

答案 0 :(得分: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

我们不希望Red低于0,所以

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

给出了

1 - (101/255) = Opacity

这导致0,604,因此使用此SelectionOpacity值,您可以计算一旦应用了不透明度,SelectionBrush需要设置为#0056B3才能变为#6599D1

以下是TextBox查看这些值的方式

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

enter image description here

答案 1 :(得分:2)

好问题,但我认为这是不可能的。如果ControlTemplate中有一些叠加,则无法制定计算颜色较深的函数,然后最终将其作为预期颜色。

e.g。当你输入红色: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以下分量的颜色都是不可逆的。