WPF更改填充颜色画笔

时间:2013-01-31 13:09:55

标签: wpf binding relative-path

在资源字典中,我存储了一个带有画布的ViewBox

<Style x:Key="MyPathStyle" TargetType="Path">
    <Setter Property="Fill" Value="{Binding BackgroundColorBrush, 
        RelativeSource={RelativeSource AncestorType=iconcontrols:IconAsVisualBrush}}"/>
</Style>
<Viewbox x:Key="Icon2">
        <Canvas Width="40.000" Height="40.000">
            <Canvas>
                <Path Fill="#ff99baf4" Data="F1 M 14.377,23.798" />
                <Path Style="{StaticResource MyPathStyle}"  Data="..." />
             </Canvas>
         </Canvas>
</Viewbox>

所以我想使用我的控件Container(名为IconAsVisualBrush)的BackgroundColorBrush更改第二个Path的颜色。 它是

<Grid x:Name="GridIconBrush" Width="40" Height="40">
        <Grid.Background>
            <VisualBrush x:Name="CtrlVisualBrush"  Stretch="Uniform" />
        </Grid.Background>
 </Grid>

VisualBrush在cs中设置:

private static void OnIconBrushResourceChanged(DependencyObject source
            , DependencyPropertyChangedEventArgs e)
        {
IconAsVisualBrush control = source as IconAsVisualBrush;
control.CtrlVisualBrush.Visual = (Viewbox)Application.Current.FindResource(e.NewValue);
        }

在我的UserControl中,我可以使用以下xaml绘制ViewBox:

<iconcontrols:IconAsVisualBrush BackgroundColorBrush="White"
                                IconBrushResource="Icon2"/>
<iconcontrols:IconAsVisualBrush BackgroundColorBrush="Red"
                                IconBrushResource="Icon2"/>

画布正确绘制但不是颜色。我收到: 无法找到与引用'RelativeSource FindAncestor绑定的源,AncestorType ='IconAsVisualBrush',AncestorLevel ='1''。 BindingExpression:路径= BackgroundColorBrush;的DataItem = NULL; target元素是'Path'(Name =''); target属性为'Fill'(类型'Brush')

有没有办法只更改所有者控件内的路径填充颜色集(不是使所有IconAsVisualBrush具有相同颜色的动态资源),以便我可以使用不同的填充颜色绘制相同的形状?

1 个答案:

答案 0 :(得分:1)

您的问题是您的Style中的Setter无法找到IconAsVisualBrush,可能是因为它不是Path的可视树的一部分。你考虑过使用触发器吗?在不知道你的应用程序架构以及调用OnIconBrushResourceChanged的情况下建议解决方案很困难 - 但是因为我们正在讨论WPF,所以我会猜测你正在使用MVVM。如果是这样,您可以像这样使用DataTriggers:

<Style x:Key="MyPathStyle" TargetType="Path">
    <Setter Property="Fill" Value="White" />
    <Style.Triggers>
        <DataTrigger Binding="{MyColourChangedProperty}"
                     Value="True">
            <DataTrigger.Setters>
                <Setter Property="Fill" Value="Red"/>
            </DataTrigger.Setters>
        </DataTrigger>
    </Style.Triggers>
</Style>

编辑:为了澄清,我在这里建议的样式会给你一个白色的默认填充,但如果你将'MyColourChangedProperty'(或你绑定的任何东西)设置为true,它将变为红色。