如何在 XAML 中的运行时动态更改 PATH DATA 属性?
How to dynamically change a PATH DATA property at runtime in XAML?
我有一个带有自定义 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 不是 Path.Style 的 属性,但我不清楚如何动态更改运行时的 PathGeometry。上面显示的第三个 DataTrigger 我尝试设置 Path.Data 属性 不起作用。
您不能直接设置路径的数据 属性,因为它 value precedence 高于样式 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>
我有一个带有自定义 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 不是 Path.Style 的 属性,但我不清楚如何动态更改运行时的 PathGeometry。上面显示的第三个 DataTrigger 我尝试设置 Path.Data 属性 不起作用。
您不能直接设置路径的数据 属性,因为它 value precedence 高于样式 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>