【问题标题】:How to dynamically change a PATH DATA property at runtime in XAML?如何在 XAML 中在运行时动态更改 PATH DATA 属性?
【发布时间】:2018-03-06 14:07:55
【问题描述】:

我有一个带有自定义 ControlTemplate 的按钮。在执行期间,我想根据用户选择的条件更改 PathGeometry 和 Fill。

在 ResourceDictionary 我有两个 PathGeometry 定义:

<PathGeometry x:Key="Card" >
    <PathFigure StartPoint="0,0" >
        <LineSegment Point="0,50"/>
        <LineSegment Point="100,50"/>
        <LineSegment Point="100,20"/>
        <LineSegment Point="80,0"/>
        <LineSegment Point="0,0"/>
    </PathFigure>
</PathGeometry>

<PathGeometry x:Key="Triangle" >
    <PathFigure StartPoint="0,0" >
        <LineSegment Point="50,50"/>
        <LineSegment Point="100,0"/>
        <LineSegment Point="0,0"/>
    </PathFigure>
</PathGeometry>

在同一个 ResourceDictionary 我定义了一个样式:

<Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Grid x:Name="grid"  Background="White">
                    <Path Stroke="Black" StrokeThickness="2" Data="{DynamicResource Card}"> 
                        <Path.Style>
                            <Style TargetType="Path">
                                <Style.Triggers>
                                    <DataTrigger
                                        Binding="{Binding HatchType, 
                                        RelativeSource={RelativeSource FindAncestor, AncestorType=local:PullArrowConnector}, 
                                        Mode=TwoWay}" Value="Withdrawal">
                                        <Setter Property="Fill" Value="{DynamicResource HatchBrush}" />
                                    </DataTrigger>
                                    <DataTrigger
                                        Binding="{Binding HatchType, 
                                        RelativeSource={RelativeSource FindAncestor, AncestorType=local:PullArrowConnector}, 
                                        Mode=TwoWay}" Value="Production">
                                        <Setter Property="Fill" Value="Transparent" />
                                    </DataTrigger>
                                    <DataTrigger
                                        Binding="{Binding HatchType, 
                                        RelativeSource={RelativeSource FindAncestor, AncestorType=local:PullArrowConnector}, 
                                        Mode=TwoWay}" Value="Signal">
                                        <Setter Property="Path.Data" Value="{DynamicResource Triangle}" />
                                        <Setter Property="Fill" Value="Transparent" />
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </Path.Style>
                    </Path>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

使用 DataTrigger,我可以动态控制 Fill 属性,但不能动态控制 Data 属性。我知道 Data 不是 Path.Style 的属性,但我不清楚如何在运行时动态更改 PathGeometry。上面显示的第三个 DataTrigger 我尝试设置 Path.Data 属性不起作用。

【问题讨论】:

    标签: wpf xaml mvvm pathgeometry


    【解决方案1】:

    您不能直接设置 Path 的 Data 属性,因为它的 value precedence 比来自 Style Setter 的值更高。因此,您的 DataTrigger 的 Setter 将被忽略。

    改为添加另一个 Setter:

    <Path Stroke="Black" StrokeThickness="2"> 
        <Path.Style>
            <Style TargetType="Path">
                <Setter Property="Data" Value="{DynamicResource Card}"/>
                <Style.Triggers>
                    <DataTrigger ...>
                        <Setter Property="Data" Value="{DynamicResource Triangle}"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        <Path.Style>
    </Path>
    

    【讨论】:

    • 克莱门斯,成功了!以后会更加注意价值优先……
    猜你喜欢
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    相关资源
    最近更新 更多