在资源字典中,我存储了一个带有画布的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具有相同颜色的动态资源),以便我可以使用不同的填充颜色绘制相同的形状?
答案 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,它将变为红色。