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

标签 wpf vb.net xaml button path

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

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

最佳答案

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

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作为常规依赖属性而不是附加属性。

关于使用路径作为附加属性的 WPF 自定义形状按钮模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19338443/

相关文章:

绑定(bind)到在工作线程上更新的 observablecollection 的 WPF 元素

c# - 处理州和国家(或省): best way to implement

c# - 是什么导致设计器中并非每个事件都可用,我如何才能像在 VB.NET 中一样在 C# 中快速生成处理程序?

mysql - 如何在vb.net中建立对sql数据库的动态查询

wpf - 自定义控件不继承父级的样式

c# - 如何停止验证触发器在wpf中自动启动

c# - 无法在具有十进制绑定(bind)的文本框中输入 "."

c# - 如何关闭来自不同进程的窗口

c# - WPF DataGrid 行标题可见性错误

c# - 在 Windows 8 应用程序中浏览文件夹?