4

我在 WPF 中使用 MV-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。绑定表达式:路径=背景颜色;数据项=空;目标元素是 'GradientStop' (HashCode=16001149); 目标属性是“颜色”(类型“颜色”)

4

2 回答 2

3

我认为您不能将其保留Brush在资源字典中并使用绑定来提取颜色。由于画笔只创建一次(这就是为什么你首先希望它在资源字典中),在创建时 WPF 不知道它将在哪里使用,所以它不能拉入值颜色。

例如,如果颜色保留在“设置”中,那可能会起作用-但我猜这对您没有帮助,因为您可能希望在使用它的每个控件上更改颜色(否则,您可以只对颜色进行硬编码,否则它已经在设置中)。

也许您可以创建一个RadialGradientBrush子类,并将第一种GradientStop颜色公开为DependencyProperty? 然后,您可以在任何需要的地方创建此子类的实例,并使用绑定在此处提取正确的颜色。

于 2009-05-31T15:24:03.843 回答
0

这有点晚了,但是看看使用 aStaticResource或 aDynamicResource而不是 a Binding- 它允许您访问另一个资源。不完全是Binding,但总比没有好。

于 2009-07-08T17:46:23.613 回答