Как с помощью DynamicResource «волшебным образом» преобразовать кисть в цвет? - PullRequest
0 голосов
/ 07 ноября 2019

Я определил некоторые ресурсы кисти в терминах системных цветов, например:

<SolidColorBrush 
   x:Key="brushKey1" 
   Color="{x:Static SystemColors.ControlColor}" 
   />

(Это сделано потому, что какой-то сторонний код ожидает найти brushKey1 определено).

Но я заметил, что следующее также компилируется и работает:

<SolidColorBrush 
   x:Key="brushKey1" 
   Color="{DynamicResource {x:Static SystemColors.ControlBrush}}" 
   />

Первый использует объект COLOR, а второй использует BRUSH.

Почему это работает? DynamicResource автоматически выясняет, как выполнить какое-то приведение или преобразование?

Обратите внимание, что это не работает:

<SolidColorBrush 
   x:Key="brushKey1" 
   Color="{x:Static SystemColors.ControlBrush}" 
   />

Эта строка будет компилироваться, но выдает исключение времени выполнения.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

Собирает? Да. Ваш brushKey1 ссылается на ресурс с x:Key из {x:Static SystemColors.ControlBrush}, используя расширение разметки DynamicResource. Вы можете установить ключ к чему угодно. Все равно скомпилируется.

Работает? Нет, если вы не определили ресурс Color с x:Key из {x:Static SystemColors.ControlBrush}:

<Color x:Key="{x:Static SystemColors.ControlBrush}">Red</Color>
0 голосов
/ 07 ноября 2019

Нет магии или конверсии. Посмотрите на Resources, там должна быть запись с SystemColors.ControlBrush объектом в качестве ключа.

Таким образом, в случае

<SolidColorBrush x:Key="brushKey1"  Color="{DynamicResource {x:Static SystemColors.ControlBrush}}"/>

вы получаете «значение» записи от ResourceDictionary.

в другом случае

<SolidColorBrush x:Key="brushKey1"  Color="{x:Static SystemColors.ControlBrush}"/>

вы пытаетесь присвоить объект, который используется в качестве «ключа» в ResourceDictionary.

...