Как присвоить ресурсы WPF другим тегам ресурса

Это довольно неясно, я могу просто пропускать что-то чрезвычайно простое.

Сценарий 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

9
задан Tom 14 June 2010 в 10:46
поделиться

2 ответа

Мне было интересно, когда кто-нибудь спросит об этом.

В сценарии 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} ), что легко забыть, что его также можно использовать с обычным синтаксис элемента.

10
ответ дан 4 December 2019 в 21:07
поделиться

Разметка, с которой вы работаете, не простирается достаточно далеко вверх. Вы не создаете 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}" />
0
ответ дан 4 December 2019 в 21:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: