рассчитать выделение цвета кисти в WPF - PullRequest
8 голосов
/ 11 августа 2011

Я заметил, что при установке выделения для текстового поля в wpf на красный и при использовании палитры цветов для проверки цвета, цвет исчез # FF9999.

У меня есть определенный цвет, который требуется моему клиенту для кисти выбора. Есть ли способ рассчитать, какой цвет я должен установить SelectionBrush, чтобы при выделении текста отображался точный цвет?

В настоящее время мне нужно, чтобы кисть выбора была # 6599D1, но после ее установки цвет # C1D6ED.

Как рассчитать начальный цвет, чтобы мне был нужен конечный цвет?

Ответы [ 2 ]

3 голосов
/ 12 августа 2011

ответ на вопрос H.B.

В прошлом я вычислял непрозрачность по следующей формуле

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

который инвертируется в

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

У TextBox по умолчанию Background установлено значение White, а SelectionOpacity установлено значение 0,4.
Как Х.Б. объяснил, что вы не можете добиться своего цвета с этими настройками по умолчанию, так как значение Red будет равно -130. Это оставляет вам 3 варианта: изменить Background, изменить SelectionOpacity или не делать этого:)

Изменение TextBox Background, вероятно, это не то, что вы хотите сделать, поэтому оставляет вариант 2, изменить SelectionOpacity

Мы не хотим, чтобы красный опустился ниже 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

2 голосов
/ 11 августа 2011

Хороший вопрос, но я думаю, что это невозможно.Если в ControlTemplate есть какое-то наложение, вы не можете сформулировать функцию, которая вычисляет более темный цвет, который в итоге получится как предполагаемый цвет.

например, когда вы вводите красный цвет: 255,0,0 вы получаете 255,153,153Теперь функция, которая должна быть применена к исходному цвету, должна затемнять красный, это, конечно, можно сделать только в красном канале, поскольку зеленый и синий уже равны нулю.Однако проблема не в красном канале (который заканчивается как 255 и, следовательно, не подвержен влиянию), поэтому любые изменения в нем будут только ухудшать цвет, а не затемнять его.

Править: Чтобы сделать это немного более математическим, функция, применяемая прозрачностью выделения:

f (x) = 0,4x + 153

Если вы примените это ко всем каналам вашего цвета, вы увидите, что это действительно так.Теперь, как мы получаем значения, которые мы хотим?Очень просто, мы инвертируем функцию:

f ^ (- 1) (x) = -2,5 (153,0 - x)

Отлично!Теперь давайте применим это к вашему цвету:

R: -130.0G: 0B: 140

Хм, не так уж и много, как мне кажется.

Это отрицательное значение, именно поэтому это не всегда возможно, так как каждый цвет, имеющий компоненты ниже 153,необратимый.

...