Включить привязку данных в общих ресурсах WPF внутри ResourceDictionary.

Я использую шаблон M-V-VM в WPF, и у меня есть фоновая кисть, которую я буду использовать довольно часто, и я хотел бы переместить ее в общий ResourceDictionary.

Единственная проблема заключается в том, что кисть использует цвет, который она получает через привязку данных к размещенному контексту.

Могу ли я в любом случае переместить кисть в ResourceDictionary и при этом найти нужное значение?

Кисть:

<RadialGradientBrush>
    <RadialGradientBrush.RelativeTransform>
        <TransformGroup>
            <ScaleTransform CenterX="0.5"
                            CenterY="0.5"
                            ScaleX="2.3"
                            ScaleY="2.3" />
            <TranslateTransform X="-0.3"
                                Y="-0.3" />
        </TransformGroup>
    </RadialGradientBrush.RelativeTransform>
    <GradientStop Color="{Binding Path=BackdropColor}"
                  Offset="1.2" />
    <GradientStop Color="#FFFFFFFF"
                  Offset="-0.1" />
</RadialGradientBrush>

После рефакторинга в ResourceDictionary и добавления ключа я назвал его так:

<StackPanel Grid.Row="0"
            Margin="0,0,0,0"
            Orientation="Horizontal"
            Background="{DynamicResource BackdropRadGradBrush}">

Но это привело к такому выводу в отладчике:

Ошибка System.Windows.Data: 2: не удается найти управляющий элемент FrameworkElement или FrameworkContentElement для целевого элемента. BindingExpression:Path=BackdropColor; Элемент данных = ноль; целевой элемент — «GradientStop» (HashCode=16001149); целевое свойство — «Цвет» (тип «Цвет»)


person Nidonocu    schedule 31.05.2009    source источник


Ответы (2)


Я не думаю, что вы можете сохранить этот Brush в своем словаре ресурсов и использовать привязку для получения цвета. Поскольку кисть создается только один раз (именно поэтому вы хотите, чтобы она была в словаре ресурсов в первую очередь), во время создания WPF не знает, где она будет использоваться, поэтому он не может получить значение для цвет.

Например, если бы цвет сохранялся в настройках, это, вероятно, сработало бы, но я предполагаю, что это не поможет вам, потому что вы, вероятно, хотите, чтобы цвет менялся для каждого элемента управления, на котором он используется (в противном случае вы могли бы просто жестко задайте цвет, иначе он уже был бы в настройках).

Может быть, вы могли бы создать подкласс RadialGradientBrush и представить первый цвет GradientStop как DependencyProperty? Затем вы можете создать экземпляр этого подкласса везде, где вам это нужно, и использовать привязку, чтобы получить правильный цвет.

person Andy    schedule 31.05.2009

Это немного поздно, но взгляните на использование StaticResource или DynamicResource вместо Binding — это позволит вам получить доступ другой Ресурс. Не совсем Binding, но это лучше, чем ничего.

person Andrew Dunkman    schedule 08.07.2009
comment
Похоже, это могло бы сработать, если бы я использовал вызов DynamicResource... а затем, возможно, указал его внутри свойства StackPanels.Resources? Я проверю и посмотрю, что я могу найти. Никогда не поздно ответить на вопрос о SO! - person Nidonocu; 10.07.2009