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

4

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

我似乎无法在按钮上显示路径数据。 我漏掉了什么?

1个回答

2

您的问题在于,您正在创建一个类型为Path的附加属性,但将其分配给模板中类型为GeometryPathData属性。要解决此问题,请按以下方式更改附加属性声明:

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"
        hmi:CustomShapeButton.PathData="M1 1 L20 0 L20 20 L0 20 Z"
        Style="{StaticResource TransparentNavButton}" />

需要注意的一点是:你的CustomShapeButton类不需要继承自Button,事实上,它不需要继承自任何东西。但如果你想创建一个派生自按钮类并具有PathData属性的自定义按钮类,则可以从Button继承,此时你应该将PathData声明为常规依赖属性而不是附加属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接