Включить привязку данных в общих ресурсах WPF внутри ResourceDictionary - PullRequest
4 голосов
/ 31 мая 2009

Я использую шаблон 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; DataItem = NULL; целевой элемент - GradientStop (HashCode = 16001149); Целевым свойством является «Цвет» (тип «Цвет»)

Ответы [ 2 ]

3 голосов
/ 31 мая 2009

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

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

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

0 голосов
/ 08 июля 2009

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

...