我有很多PathGeometry实例,可以为不同的按钮绘制各种图形。所以我创建了一个按钮类型来显示Path,然后根据按钮状态更新Path.Stroke。所以在禁用时显示为灰色,鼠标结束时显示不同的颜色。标准的东西......
<Style x:Key="BasePathButton" TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border Name="Border"
<Path x:Name="Path" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="Path" Property="Stroke" Value="Gray"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Path" Property="Stroke" Value="Green"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="Path" Property="Stroke" Value="Red"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
但显然我需要为每个按钮实例使用不同的Path.Data。所以我创建一个基于OnOn的样式来设置像这样的Path.Data ......
<Style x:Key="NLB" TargetType="{x:Type Button}" BasedOn="{StaticResource BasePathButton}">
<Setter TargetName="Path" Property="Data" Value="{StaticResource LeftPathGeometry}"/>
</Style>
...但是失败了,发现无法找到TargetName =“Path”的错误。任何想法如何解决这一问题?或者也许是一种更好的方法来创建一个具有Path的按钮,该按钮使用要使用的几何参数化?
答案 0 :(得分:9)
你不能通过名称来定位模板中的元素,它是一个不同的名称范围,我认为TargetName
仅适用于ControlTemplate.Triggers
。您可以将数据引用为DynamicResource
,然后将资源添加到您的各个样式中。
e.g。
<Path Data="{DynamicResource PathData}" .../>
<Style x:Key="..." BasedOn="...">
<Style.Resources>
<!-- not sure if this actually works, you could also try DynamicResource here -->
<StaticResource x:Key="PathData" ResourceKey="LeftPathGeometry"/>
</Style.Resources>
</Style>
这是一个完整的独立示例,显示了这种技术(似乎只适用于动态编译的XAML!):
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<SolidColorBrush x:Key="RedBrush" Color="Red"/>
<SolidColorBrush x:Key="BlueBrush" Color="Blue"/>
<Style x:Key="BaseStyle" TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border BorderBrush="{DynamicResource StyleBrush}" BorderThickness="3" Padding="5">
<ContentPresenter TextElement.Foreground="{DynamicResource StyleBrush}"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="RedStyle" BasedOn="{StaticResource BaseStyle}" TargetType="Button">
<Style.Resources>
<StaticResource x:Key="StyleBrush" ResourceKey="RedBrush"/>
</Style.Resources>
</Style>
<Style x:Key="BlueStyle" BasedOn="{StaticResource BaseStyle}" TargetType="Button">
<Style.Resources>
<StaticResource x:Key="StyleBrush" ResourceKey="BlueBrush"/>
</Style.Resources>
</Style>
</Page.Resources>
<StackPanel>
<Button Content="Test" Style="{StaticResource RedStyle}"/>
<Button Content="Test" Style="{StaticResource BlueStyle}"/>
</StackPanel>
</Page>