gpt4 book ai didi

wpf - Setter.TargetName 不适用于 BasedOn 设置中的元素

转载 作者:行者123 更新时间:2023-12-01 23:11:48 25 4
gpt4 key购买 nike

我有许多 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。所以我创建了一个 BasedOn 样式来像这样设置 Path.Data...

<Style x:Key="NLB" TargetType="{x:Type Button}" BasedOn="{StaticResource BasePathButton}">
<Setter TargetName="Path" Property="Data" Value="{StaticResource LeftPathGeometry}"/>
</Style>

...但这失败了,并出现无法找到 TargetName="Path"的错误。任何想法如何解决这一问题?或者也许是一种更好的方法来创建一个按钮,该按钮具有一个使用要使用的几何参数化的路径?

最佳答案

您不能通过名称定位模板中的元素,这是一个不同的名称范围,而且我认为 TargetName 仅适用于 ControlTemplate.Triggers。您可以将数据引用为 DynamicResource,然后将资源添加到您的个人样式中。

例如

<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>

关于wpf - Setter.TargetName 不适用于 BasedOn 设置中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11821150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com