8

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

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

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

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

4

2 回答 2

3

跟进HB的回答

我过去用以下公式计算了不透明度

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

反转为

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

TextBox默认设置为Background白色并SelectionOpacity设置为 0.4。
正如 HB 解释的那样,您无法使用这些默认设置实现您的颜色,因为红色值将显示为 -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" />

在此处输入图像描述

于 2011-08-12T00:36:09.653 回答
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都是不可逆的。

于 2011-08-11T16:37:01.550 回答