我对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
为常规依赖项属性,而不是附加属性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句