2011-08-11 16 views
8

Zauważyłem przy ustawianiu zaznaczenia pola tekstowego w WPF na czerwony i przy użyciu selektora kolorów do sprawdzenia koloru, kolor wyblakł na # FF9999.obliczyć kolor pędzla wyboru w WPF

Mam określony kolor wymagany przez mojego klienta do wyboru pędzla. Czy istnieje sposób, aby obliczyć jaki kolor powinienem ustawić SelectionBrush tak, aby po zaznaczeniu tekstu wyświetlany był dokładny kolor?

Obecnie potrzebuję pędzla wyboru jako # 6599D1, ale po ustawieniu kolor to # C1D6ED.

Jak mogę obliczyć kolor początkowy, aby kolor końcowy był tym, czego potrzebuję?

+1

można podać kod użyty do ustawienia koloru? – Jakub

+0

Podejrzewam, że kolor jest wykonywany jako półprzeźroczysty i musisz go zamaskować. Nie widząc, jak zmieniasz kolor, nie mam łatwego sposobu, aby zasugerować coś więcej. –

+0

Nie pomaga, jeśli próbujesz wykonać wysoce niestandardowy styl, ale wolę pozostawić domyślne kolory systemowe, a podczas tworzenia niestandardowych elementów sterujących pożyczyć domyślne kolory systemu z podobnych kontekstów. Jest to przydatne w celu zapewnienia zgodności z trybami dostępności okien i sprawia, że ​​użytkownicy mogą korzystać z motywów okna bez powodowania nieprzyjemnych wizualnych konfliktów. –

Odpowiedz

2

Dobre pytanie, ale myślę, że to niemożliwe. Jeśli na ControlTemplate znajduje się trochę nakładki, nie można sformułować funkcji, która oblicza ciemniejszy kolor, który następnie będzie wyglądał jak zamierzony.

np. gdy wpiszesz czerwony, który jest: 255,0,0 otrzymasz 255,153,153, teraz funkcja, która musiałaby zostać zastosowana do twojego początkowego koloru, musiała przyciemnić kolor czerwony, to oczywiście można było zrobić tylko w czerwonym kanale, ponieważ zielony i niebieski są już zerowe . Problemem nie jest jednak czerwony kanał (który kończy się jako 255, a więc nie ma na niego wpływu), więc wszelkie zmiany w tym będą służyć tylko do zaciemnienia koloru, zamiast go przyciemnić.

Edycja: W tym nieco bardziej mathmatical wykonania, funkcja, która jest stosowana przez przejrzystości wybór jest:

f (x) = 0,4X + 153

Jeśli zastosujesz to do wszystkich kanałów swojego koloru, zobaczysz, że tak właśnie jest. Jak uzyskać wartości, które chcemy uzyskać? Dość proste, to odwrócić funkcję, którą jest to,

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

Bardzo! Teraz pozwala zastosować to do koloru:

R: -130,0
G: 0
B: 140

Hmm, nie tak wielka, mimo wszystko sądzę.

Ta wartość ujemna jest dokładnie powodem, dla którego nie zawsze jest to możliwe, ponieważ każdy kolor, który zawiera komponenty poniżej 153, nie jest odwracalny.

3

Nawiązując do odpowiedzi przez H.B.

Mam krycie obliczana według następującego wzoru w minionym

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

który odwraca się

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

TextBox ma ustawionej domyślnej Background na biały i SelectionOpacity ustawiono na 0,4.
Jako H.B. wyjaśniono, że nie można osiągnąć swojego koloru za pomocą tych domyślnych ustawień, ponieważ wartość Czerwona pojawi się jako -130. To pozostawia cię z 3 opcji Zmień Background zmień SelectionOpacity lub nie zrobić :)

Zmiana TextBox Background prawdopodobnie nie jest coś chcesz zrobić tak, że pozostawia opcję 2, zmień SelectionOpacity

We don” t chcą Red iść poniżej 0 więc

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

co daje

1 - (101/255) = Opacity 

Powoduje 0,604 s o przy tej wartości SelectionOpacity można obliczyć, że SelectionBrush musi być ustawiony na #0056B3, aby stał się #6599D1 po zastosowaniu Krycia.

Oto jak TextBox wygląd z tymi wartościami

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

enter image description here

+0

Interesujący pomysł, ale tekst ten staje się istotnie mniej czytelny przy tak wysokich wartościach. –

+0

@HB: Z pewnością robi, cały "TextBox" wygląda trochę zniekształcone lub niewyraźne w obrazie (jest nieco lepszy w aplikacji), ale tak, to na pewno trudniejsze do odczytania –

+0

Nie podważaj mojego ostatniego komentarza .. wyglądało rozmazane na moim komputerze z Windows 7, ale z innego komputera wygląda ostro ... –