我正在使用WPF中的M-V-VM模式,我有一个背景画笔,我将会经常使用它,我想把它移到一个共享的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:路径= BackdropColor;的DataItem = NULL; target元素是'GradientStop'(HashCode = 16001149); target属性为'Color'(类型'Color')
答案 0 :(得分:3)
我认为您不能将此Brush
保留在资源字典中并使用绑定来提取颜色。由于刷子只创建一次(这就是你首先想要它在资源字典中的原因),因此在创建时WPF不知道它将在何处使用,因此它不能为颜色。
例如,如果颜色保存在Setings中,那可能会起作用 - 但我猜这对你没用,因为你可能希望颜色在每个使用它的控件上改变(否则,你可以硬编码颜色,或者它已经在设置中。)
也许你可以创建一个RadialGradientBrush
子类,并将第一个GradientStop
颜色公开为DependencyProperty
?然后,您可以在需要的地方创建此子类的实例,并使用绑定在那里提取正确的颜色。
答案 1 :(得分:0)
这有点晚了,但请看一下使用StaticResource
或DynamicResource
而不是Binding
- 它会允许您访问另一个资源。不完全Binding
,但它总比没有好。