我的自定义控件IconMD
包含属性IconName
,OverlayName
和OverlayPosition
我已将此控件嵌入到另一个自定义控件IconButton
中,如下所示:
<ControlTemplate TargetType="{x:Type local:IconButton}">
<Border
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<Border.Style>
<Style TargetType="{x:Type Border}">
<Setter Property="Opacity" Value="0.7"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Opacity" Value="1"/>
</Trigger>
</Style.Triggers>
</Style>
</Border.Style>
<Grid>
<local:IconMD
x:Name="_ButtonIcon"
OverlayPosition="{TemplateBinding OverlayPosition}"
IconName="{TemplateBinding IconName}"
OverlayName="{TemplateBinding OverlayIconName}"
/>
</Grid>
</Border>
</ControlTemplate>
此OverlayPosition
控件的依赖属性IconName
,OverlayIconName
和IconButton
的唯一目的只是传递给嵌入式Icon - 与BorderBrush
等。
现在,因为我还有IconToggleButton
和IconRepeatButton
(从相应的基类继承,不能从IconButton
继承!),我必须为每个基类重复这种模式。如果我的IconMD
类的功能增长,我将不得不在每个使用它的自定义控件中扩展此模式。
如何在我的IconMD
之外简单地创建名为IconButton
Control“_ButtonIcon”的(属性)?
我会想象而不是这个
<imCC:IconButton
IconName="mdi-account-card-details"
OverlayIconName="mdi-multiplication-box"/>
写这样的东西
<imCC:IconButton
_ButtonIcon.IconName="mdi-account-card-details"
_ButtonIcon.OverlayName="mdi-multiplication-box"/>
答案 0 :(得分:1)
您可以将属性定义为可以在任何UIElement
或Button
元素上设置的附加属性。
附加属性概述: https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/attached-properties-overview
namespace WpfApplication1
{
public static class AttachedProperties
{
public static readonly DependencyProperty IsBubbleSourceProperty = DependencyProperty.RegisterAttached(
"IconName", typeof(string), typeof(AttachedProperties));
public static void SetIconName(UIElement element, string value)
{
element.SetValue(IsBubbleSourceProperty, value);
}
public static string GetIconName(UIElement element)
{
return (string)element.GetValue(IsBubbleSourceProperty);
}
}
}
<imCC:IconButton xmlns:local="clr-namespace:WpfApplication1"
local:AttachedProperties.IconName="mdi-account-card-details" />
答案 1 :(得分:1)
您可以使用附加属性而不是普通依赖项属性(在带有剪切propa
的visual studio中创建)。
如果您在课程IconName
中创建IconButton
作为附加属性,请按如下所示进行设置:
<imCC:IconButton
imCC:IconButton.IconName="mdi-account-card-details"
...
并在ControlTemplate
中使用,如下所示:
<local:IconMD
x:Name="_ButtonIcon"
IconName="{Binding Path=(local:IconButton.IconName),RelativeSource={RelativeSource TemplatedParent}}"
...