代码之家  ›  专栏  ›  技术社区  ›  VolkerK

在资源字典中的共享WPF资源中启用数据绑定

  •  4
  • VolkerK  · 技术社区  · 17 年前

    我在WPF中使用m-V-VM模式,我有一个背景画笔,我将经常使用,我想把它移到一个共享资源字典中。

    唯一的问题是画笔使用的颜色是通过数据绑定到其托管上下文获得的。

    画笔:

    <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}">
    

    但这导致调试器中出现以下输出:

    系统.Windows.Data错误:2:找不到目标元素的管理FrameworkElement或FrameworkContentElement。绑定xpression:Path=BackdropColor;DataItem=null;目标元素为“GradientStop”(HashCode=16001149);目标属性为“Color”(类型为“Color”)

    2 回复  |  直到 17 年前
        1
  •  3
  •   Andy    17 年前

    我觉得你不能留着这个 Brush 在您的资源字典中,并使用绑定拉入颜色。由于画笔只创建了一次(这就是为什么您首先希望它出现在资源字典中的原因),因此在创建时WPF不知道它将在哪里使用,因此它无法拉入颜色的值。

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

    也许你可以创造一个 RadialGradientBrush 子类,并公开第一个 GradientStop 颜色为 DependencyProperty ? 然后,您可以在任何需要的地方创建此子类的实例,并使用binding在其中拉入正确的颜色。

        2
  •  0
  •   Nicholas DiPiazza    17 年前

    现在有点晚了,但是看看 StaticResource 或者 DynamicResource 而不是 Binding -它将允许您访问其他资源。不完全 结合 ,但总比什么都没有好。

    推荐文章