C#DependencyProperty - 使用复杂类型的默认属性

时间:2017-04-04 23:41:46

标签: c# uwp custom-controls

我正在创建一个模仿AppBarButton的自定义控件(但具有使我们无法从AppBarButton派生的自定义功能)。

我的问题在于Icon的{​​{1}}属性。该属性本身需要AppBarButton,但如果您要创建IconElement并指定AppBarButton内联,则默认为Icon枚举并创建Symbol对你而言。

我的问题是:我将如何复制这个?我似乎无法找到有关如何执行此操作的任何信息。

谢谢!

2 个答案:

答案 0 :(得分:4)

IconElement是这些类的父类:

SymbolIcon分配给AppBarButton Icon属性是没有问题的。在UWP XAML系统中,有SymbolIcon的内置类型转换器支持。对于复制,您应该能够定义DependencyProperty哪个类型为IconElement,然后将其用作AppBarButton

举一个简单的例子,我创建了一个名为" CustomAppBarButton"的模板控件。使用名为" Icon"。

的依赖项属性

CustomAppBarButton.cs

public sealed class CustomAppBarButton : Control
{
    public CustomAppBarButton()
    {
        this.DefaultStyleKey = typeof(CustomAppBarButton);
    }

    public IconElement Icon
    {
        get { return (IconElement)GetValue(IconProperty); }
        set { SetValue(IconProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Icon.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty IconProperty =
        DependencyProperty.Register("Icon", typeof(IconElement), typeof(CustomAppBarButton), new PropertyMetadata(null));
}

Generic.xaml:

<Style TargetType="local:CustomAppBarButton">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:CustomAppBarButton">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <ContentPresenter x:Name="Content"
                                      HorizontalAlignment="Stretch"
                                      Content="{TemplateBinding Icon}"
                                      Foreground="{TemplateBinding Foreground}" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

然后你可以像下面一样使用它。

<local:CustomAppBarButton Icon="Like" Foreground="Red" />

答案 1 :(得分:2)

您正在寻找的是XAML型转换器。当属性的内容可以使用简写表示法时,它们允许您创建自定义解析方法。例如,当您键入点值Point="10,25"时,会有一个内置解析器从字符串中提取x和y值。

您可以创建自己的。 Tim Heuer has an example here