gpt4 book ai didi

xaml - 绑定(bind)到 ControlTemplate 内的嵌套属性

转载 作者:行者123 更新时间:2023-12-04 12:27:42 25 4
gpt4 key购买 nike

目的是为我的自定义按钮模板建立图标路径几何的资源字典。

到目前为止有效的方法:

资源字典:

<Geometry x:Key="ArrowDown">
M0,10 M10,0 M5,1 L5,7 4.2,7 5,8 5.8,7 5,7
</Geometry>
<Geometry x:Key="ArrowUp">
M0,0 M10,10 M5,9 L5,3 4.2,3 5,2 5.8,3 5,3
</Geometry>

路径的附加属性:
public static Geometry GetIconPath(UIElement element)
{
return (Geometry)element.GetValue(IconPathProperty);
}

public static void SetIconPath(UIElement element, Geometry value)
{
element.SetValue(PIconPathProperty, value);
}

public static readonly DependencyProperty IconPathProperty =
DependencyProperty.RegisterAttached("IconPath", typeof(Geometry), typeof(Attached));

模板:
<ControlTemplate x:Key="ButtonTemplate" TargetType="{x:Type Button}">
<Viewbox>
<Path Name="Icon" Stroke="Black" StrokeThickness="1" Stretch="Uniform"
Data="{Binding (local:Attached.IconPath), RelativeSource={RelativeSource TemplatedParent}}"/>
</Viewbox>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Stroke" TargetName="Icon" Value="Gray"/>
<Setter TargetName="Icon" Property="Effect">
<Setter.Value>
<DropShadowEffect ShadowDepth="0.2" Color="Black" Direction="125"/>
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>

按钮:
<Button local:Attached.IconPath="{StaticResource ArrowDown}"/>

这很好用,但我现在增加了一层复杂性:一些图标需要填充,而另一些则不需要。我想在带有 GeometryData 的 ResourceDictionary 中有这些信息。

一种解决方案是将整个路径存储在 ResourceDictionary 中,但正如您在 ControlTemplate 中看到的,我需要能够访问路径以触发 DropShadowEffect。

因此,我尝试的替代解决方案是使用 POCO 将这两个元素存储在:
public class IconData
{
public bool Fill { get; set; }
public Geometry Geometry { get; set; }
}

所以 ResourceDictionary 现在包含:
<local:IconData x:Key="ArrowUp" Fill="True" Geometry="
M0,0 M10,10 M5,9 L5,3 4.2,3 5,2 5.8,3 5,3"/>

使用适当的附加属性,ControlTemplate 变为:
<ControlTemplate x:Key="ButtonTemplate" TargetType="{x:Type Button}">
<Viewbox>
<Path Name="Icon" Stroke="Black" StrokeThickness="1" Stretch="Uniform"
Data="{Binding (local:Attached.IconData.Geometry), RelativeSource={RelativeSource TemplatedParent}}"/>
</Viewbox>
<ControlTemplate.Triggers>
<Trigger Property="local:Attached.IconData.Fill" Value="True">
<Setter Property="Fill" TargetName="Icon" Value="#00000000"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Stroke" TargetName="Icon" Value="Gray"/>
<Setter TargetName="Icon" Property="Effect">
<Setter.Value>
<DropShadowEffect ShadowDepth="0.2" Color="Black" Direction="125"/>
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>

不幸的是,这里对 IconData 的两个引用都说 Nested types are not supported: Attached.IconData .

我愿意为我的实现提供解决方案,或者任何解决方法或不同的解决方案。

最佳答案

<Path Name="Icon" Stroke="Black" StrokeThickness="1" Stretch="Uniform"
Data="{Binding (local:Attached.IconData.Geometry), RelativeSource={RelativeSource TemplatedParent}}"/>

这里 (local:Attached.IconData.Geometry)表示嵌套类型。获得 Attached.IconData 的属性(property)对象一应使用以下绑定(bind)路径:
<Path Name="Icon" Stroke="Black" StrokeThickness="1" Stretch="Uniform"
Data="{Binding (local:Attached.IconData).Geometry, RelativeSource={RelativeSource TemplatedParent}}"/>

还要确保从 Geometry 更改附加的属性类型至 IconDataAttached类型。
IconData类不应该嵌套到任何类型,因为它正是所谓的不支持的(只是放在与其他使用的类型相同的命名空间中)。

在这些修改之后,您的代码开始为我工作。

这是主窗口 XAML:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="MainWindow" Height="250" Width="260">
<Window.Resources>
<ResourceDictionary>
<local:IconData x:Key="ArrowUp" Fill="False" Geometry="M0,0 M10,10 M4.8,9 4.8,3 4.2,3 5,2 5.8,3 5.2,3 5.2,9 Z"/>
<ControlTemplate x:Key="ButtonTemplate" TargetType="{x:Type Button}">
<Viewbox>
<Path Name="Icon" Stretch="Uniform"
Data="{Binding (local:Attached.IconPath).Geometry, RelativeSource={RelativeSource TemplatedParent}}">
<Path.Style>
<Style TargetType="Path">
<Style.Triggers>
<DataTrigger Binding="{Binding (local:Attached.IconPath).Fill, RelativeSource={RelativeSource TemplatedParent}}"
Value="True">
<Setter Property="Fill" Value="Black" />
</DataTrigger>
<DataTrigger Binding="{Binding (local:Attached.IconPath).Fill, RelativeSource={RelativeSource TemplatedParent}}"
Value="False">
<Setter Property="Stroke" Value="Black" />
<Setter Property="StrokeThickness" Value="0.2" />
</DataTrigger>
</Style.Triggers>
</Style>
</Path.Style>
</Path>
</Viewbox>
</ControlTemplate>

</ResourceDictionary>
</Window.Resources>

<Button local:Attached.IconPath="{StaticResource ArrowUp}" Template="{StaticResource ButtonTemplate}" />
</Window>

请注意,我已经修改了 M0,0 M10,10 M4.8,9 4.8,3 4.2,3 5,2 5.8,3 5.2,3 5.2,9 Z 上的路径几何图形。使其封闭,因此适合填充。

以下是案例截图 <local:IconData Fill="False" ... /><local:IconData Fill="True" ... /> :

A screenshot for case Fill=False
A screenshot for case Fill=True

关于xaml - 绑定(bind)到 ControlTemplate 内的嵌套属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49323774/

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