使用路径作为附加属性的WPF自定义形状按钮模板

使用路径作为附加属性的WPF自定义形状按钮模板,wpf,vb.net,xaml,button,path,Wpf,Vb.net,Xaml,Button,Path,我对WPF还是相当陌生的。我正在尝试创建一个按钮模板,该模板使用按钮形状的路径数据。我的应用程序有几个按钮,它们将执行类似的任务,但需要不同的形状。我正在尝试创建一个附加属性,该属性将路径数据传递给我的模板。到目前为止,我得到的是: 所附财产: Public Class CustomShapeButton Inherits Button Public Shared PathDataProperty As DependencyProperty = DependencyProperty.Re

我对WPF还是相当陌生的。我正在尝试创建一个按钮模板,该模板使用按钮形状的路径数据。我的应用程序有几个按钮,它们将执行类似的任务,但需要不同的形状。我正在尝试创建一个附加属性,该属性将路径数据传递给我的模板。到目前为止,我得到的是:

所附财产:

Public Class CustomShapeButton
    Inherits Button
Public Shared PathDataProperty As DependencyProperty = DependencyProperty.RegisterAttached("PathData", GetType(Path), GetType(CustomShapeButton), New PropertyMetadata(Nothing))

Public Shared Sub SetPathData(obj As DependencyObject, value As Path)
    obj.SetValue(PathDataProperty, value)
End Sub
Public Shared Function GetPathData(obj As DependencyObject) As Path
    Return DirectCast(obj.GetValue(PathDataProperty), Path)
End Function
End Class
以及位于我的资源字典中的按钮模板:

    <Style x:Key="TransparentNavButton" TargetType="{x:Type Button}">
    <Setter Property="FontSize" Value="16"/>
    <Setter Property="FontWeight" Value="Bold"/>
    <Setter Property="BorderBrush" Value="Transparent"/>
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Grid>
                    <Path x:Name="pth" Data="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(hmi:CustomShapeButton.PathData)}" Stroke="Black" Stretch="Fill"/>
                    <ContentPresenter x:Name="ButtonContentPresenter" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0,0,4,0"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter TargetName="pth" Property="Fill" Value="#60FF0000"/>
                        <Setter TargetName="pth" Property="Stroke" Value="Blue"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

然后尝试实现如下内容:

<Button Content="Button" Width="60" Height="50" Style="{StaticResource TransparentNavButton}">
    <hmi:CustomShapeButton.PathData>
        <Path Data="M1 1 L20 0 L20 20 L0 20 Z"/>
    </hmi:CustomShapeButton.PathData>
</Button>
<Button Content="Button" Width="60" Height="50"
        hmi:CustomShapeButton.PathData="M1 1 L20 0 L20 20 L0 20 Z"
        Style="{StaticResource TransparentNavButton}" />


我似乎无法在按钮上显示路径数据。我缺少什么?

您的问题是,您正在创建类型为
Path
的附加属性,但将其分配给模板中类型为
Geometry
PathData
属性。若要解决此问题,请更改附加的属性声明,如下所示:

Public Class CustomShapeButton
Public Shared PathDataProperty As DependencyProperty = DependencyProperty.RegisterAttached("PathData", GetType(Geometry), GetType(CustomShapeButton), New PropertyMetadata(Nothing))

Public Shared Sub SetPathData(obj As DependencyObject, value As Geometry)
    obj.SetValue(PathDataProperty, value)
End Sub
Public Shared Function GetPathData(obj As DependencyObject) As Geometry
    Return DirectCast(obj.GetValue(PathDataProperty), Geometry)
End Function
End Class
然后像这样使用它:

<Button Content="Button" Width="60" Height="50" Style="{StaticResource TransparentNavButton}">
    <hmi:CustomShapeButton.PathData>
        <Path Data="M1 1 L20 0 L20 20 L0 20 Z"/>
    </hmi:CustomShapeButton.PathData>
</Button>
<Button Content="Button" Width="60" Height="50"
        hmi:CustomShapeButton.PathData="M1 1 L20 0 L20 20 L0 20 Z"
        Style="{StaticResource TransparentNavButton}" />


还有一点需要注意:您的
CustomShapeButton
类不需要从
Button
继承-事实上,它根本不需要从任何东西继承。但是,如果您希望创建自己的具有
PathData
属性的派生按钮类,那么您可以从
button
继承,在这种情况下,您可以将
PathData
声明为常规依赖属性,而不是附加属性。

非常有效,谢谢!