在 ResourceDictionary 中启用共享 WPF 资源的数据绑定。

4

我在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 Error: 2 : 找不到目标元素的 FrameworkElement 或 FrameworkContentElement。BindingExpression:Path=BackdropColor; DataItem=null; target element is 'GradientStop' (HashCode=16001149); target property is 'Color' (type 'Color')

2个回答

3
我认为您不能将此Brush放在资源字典中并使用绑定来提取颜色。由于画笔只创建一次(这也是您希望首先将其放入资源字典的原因),在创建时,WPF不知道它将在哪里使用,因此无法引入颜色的值。
如果将颜色保存在设置中,则可能有效-但我猜想这对您没有帮助,因为您可能希望每个控件上使用它的颜色都会更改(否则,您可以硬编码颜色或已经将其保存在设置中)。
也许您可以创建一个RadialGradientBrush子类,并将第一个GradientStop颜色公开为DependencyProperty?然后,您可以在需要的任何地方创建此子类的实例,并使用绑定来在那里引入正确的颜色。

0
这可能有点晚了,但是看一下使用StaticResourceDynamicResource而不是Binding - 这将允许您访问另一个资源。虽然不完全像Binding,但总比没有好。

这听起来如果我使用DynamicResource调用可能会起作用...然后在StackPanels.Resources属性内指定它,也许?我会测试并看看我能找到什么。在SO上回答问题永远不会太晚! - Nidonocu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接