0

在资源字典中,我存储了一个带有 Canvas 的 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>

所以我想使用我的控件容器(称为 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:Path=BackgroundColorBrush; 数据项=空;目标元素是'路径'(名称='');目标属性是“填充”(输入“画笔”)

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

4

1 回答 1

1

您的问题是您的样式中的 Setter 无法找到 IconAsVisualBrush,大概是因为它不是路径视觉树的一部分。您是否考虑过使用触发器?在不了解您的应用程序架构和调用 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,它会变成红色。

于 2013-01-31T13:27:09.743 回答