Это довольно неясно, я могу просто пропускать что-то чрезвычайно простое.
Сценарий 1
Позволяет говорят, что я создаю градиентную кисть, как это в моем <Window.Resources>
раздел:
<LinearGradientBrush x:Key="GridRowSelectedBackBrushGradient" StartPoint="0,0" EndPoint="0,1">
<GradientStop Color="#404040" Offset="0.0" />
<GradientStop Color="#404040" Offset="0.5" />
<GradientStop Color="#000000" Offset="0.6" />
<GradientStop Color="#000000" Offset="1.0" />
</LinearGradientBrush>
Затем очень позже, я хочу переопределить HighlightBrushKey
для DataGrid. Я в основном сделал это как это (ужасное);
<LinearGradientBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"
GradientStops="{Binding Source={StaticResource GridRowSelectedBackBrushGradient}, Path=GradientStops}"
StartPoint="{Binding Source={StaticResource GridRowSelectedBackBrushGradient}, Path=StartPoint}"
EndPoint="{Binding Source={StaticResource GridRowSelectedBackBrushGradient}, Path=EndPoint}" />
Это - очевидно, не самый гладкий способ сослаться на ресурс. Я также придумал следующую проблему, которая почти идентична.
Сценарий 2
Скажите, что я создал два, раскрашивает мой <Window.Resources>
разметка, как так:
<SolidColorBrush x:Key="DataGridRowBackgroundBrush" Color="#EAF2FB" />
<SolidColorBrush x:Key="DataGridRowBackgroundAltBrush" Color="#FFFFFF" />
Затем позже я хочу предоставить их в Массиве, который подает ConverterParameter на Привязке, таким образом, я могу предоставить пользовательский Преобразователь свои статические экземпляры ресурса:
<Setter Property="Background">
<Setter.Value>
<Binding RelativeSource="{RelativeSource Mode=Self}"
Converter="{StaticResource BackgroundBrushConverter}">
<Binding.ConverterParameter>
<x:Array Type="{x:Type Brush}">
<SolidColorBrush Color="{Binding Source={StaticResource DataGridRowBackgroundBrush}, Path=Color}" />
<SolidColorBrush Color="{Binding Source={StaticResource DataGridRowBackgroundAltBrush}, Path=Color}" />
</x:Array>
</Binding.ConverterParameter>
</Binding>
</Setter.Value>
</Setter>
То, что я сделал, является попыткой повторно сослаться на существующий ресурс, но в моих усилиях я на самом деле воссоздал ресурс и связал свойства, таким образом, они соответствуют. Снова, это не идеально.
Поскольку я теперь поразил эту проблему по крайней мере дважды, есть ли лучший путь?
Спасибо, Tom
Мне было интересно, когда кто-нибудь спросит об этом.
В сценарии 1 вы хотите эффективно присвоить отдельному ресурсу «псевдоним». Это легко сделать с помощью разметки, которая кажется очевидной только после того, как вы ее увидите. Предположим, у нас есть это в нашем App.xaml или где-то еще:
<ResourceDictionary>
<LinearGradientBrush x:Key="GridRowSelectedBackBrushGradient" ... />
</ResourceDictionary>
Чтобы включить псевдоним в другой ResourceDictionary, просто:
<ResourceDictionary>
<StaticResourceExtension x:Key="{x:Static SystemColors.HighlightBrushKey}"
ResourceKey="GridRowSelectedBackBrushGradient" />
</ResourceDictionary>
Это ищет объект кисти в первом ResourceDictionary и добавляет тот же объект во второй ResourceDictionary в новом ключ. Это также работает в пределах одного ResourceDictionary.
Для вашего Сценария 2 решение столь же простое:
<Binding.ConverterParameter>
<x:Array Type="{x:Type Brush}">
<StaticResourceExtension ResourceKey="DataGridRowBackgroundBrush" />
<StaticResourceExtension ResourceKey="DataGridRowBackgroundAltBrush" />
</x:Array>
</Binding.ConverterParameter>
Опять же, фактические объекты Brush
, найденные с помощью ResourceKey
, добавляются непосредственно в Brush []
массив. Новая кисть
не создается.
Я думаю, мы все так привыкли использовать StaticResourceExtension
с синтаксисом расширения разметки (например, {StaticResource Xyz}
), что легко забыть, что его также можно использовать с обычным синтаксис элемента.
Разметка, с которой вы работаете, не простирается достаточно далеко вверх. Вы не создаете LinearGradientBrush
, ваш первый пример: вы просто ссылаетесь на ресурс. Например:
<DataGrid HighlightBrushKey="{StaticResource GridRowSelectedBackBrushGradient}" ....
Во втором примере я бы сказал, что вы хотите объявить массив как ресурс:
<x:Array Type="{x:Type Brush}" x:Key="MyArray">
<SolidColorBrush Color="#EAF2FB" />
<SolidColorBrush Color="#FFFFFF" />
</x:Array>
А затем вы можете использовать
<Binding RelativeSource="{RelativeSource Mode=Self}"
Converter="{StaticResource BackgroundBrushConverter}"
ConverterParameter="{Staticresource MyArray}" />