如何在UWP中为依赖属性添加静态资源的默认值

3

我正在编写一个自定义的超链接控件(通过继承自Hyperlink),在我的自定义样式中有多个文本块,我希望允许用户使用我的自定义控件来为这些文本块分配样式,并仅在用户没有定义样式时,在我的资源中应用静态资源样式。

MyHyerlink.cs

public partial class MyHyperlink : HyperlinkButton
{
    public MyHyperlink()
    {
        this.DefaultStyleKey = typeof(MyHyperlink);
    }

    protected override void OnApplyTemplate()
    {
        _txtTitle = GetTemplateChild(TextTitle) as TextBlock;
        _txtContent = GetTemplateChild(TextContent) as TextBlock;
        base.OnApplyTemplate();
    }

    public static readonly DependencyProperty TitleStyleProperty = DependencyProperty.Register(
        nameof(TitleStyle),
        typeof(Style),
        typeof(MyHyperlink),
        new PropertyMetadata(null));

    public Style TitleStyle
    {
        get { return (Style)GetValue(TitleStyleProperty); }
        set { SetValue(TitleStyleProperty, value); }
    }

    public static readonly DependencyProperty DescriptionStyleProperty = DependencyProperty.Register(
        nameof(DescriptionStyle),
        typeof(Style),
        typeof(MyHyperlink),
        new PropertyMetadata(null));

    public Style DescriptionStyle
    {
        get { return (Style)GetValue(DescriptionStyleProperty); }
        set { SetValue(DescriptionStyleProperty, value); }
    }
}

MyHyperlink.xaml

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Myproject.Controls">
<Style TargetType="TextBlock" x:Key="UrlTitleStyle">
    <Setter Property="FontSize" Value="12" />
    <Setter Property="FontWeight" Value="Bold" />
</Style>
<Style TargetType="TextBlock" x:Key="UrlDescriptionStyle">
    <Setter Property="FontSize" Value="9" />
</Style>
<Style TargetType="local:MyHyperlink">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:MyHyperlink">
                <Grid>
                    <!--Url Part template with parsed image and http content-->
                    <Border Name="UrlPartTemplate">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="50" />
                                <ColumnDefinition Width="*" />
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="50" />
                                <RowDefinition Height="*" />
                            </Grid.RowDefinitions>
                            <Image VerticalAlignment="Stretch"
                                   Name="imgLogo"
                                   Grid.Column="0"
                                   />
                            <TextBlock Name="txtTitle"
                                       Grid.Column="1"
                                       Margin="5 0"
                                       VerticalAlignment="Center"
                                       TextWrapping="Wrap"
                                       MaxLines="2"
                                       Style="{StaticResource UrlTitleStyle}"
                                       TextTrimming="CharacterEllipsis"/>
                            <TextBlock Name="txtContent"
                                       Grid.Row="1"
                                       Grid.ColumnSpan="2"
                                       Margin="5, 5"
                                       TextWrapping="Wrap"
                                       MaxLines="3"
                                       Style="{StaticResource UrlDescriptionStyle}"
                                       TextTrimming="CharacterEllipsis" />
                        </Grid>
                    </Border>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

在上面的XAML中,当代码中声明的TitleStyle和DescriptionStyle依赖属性没有提供任何样式时,控件txtContent和txtTitle应该仅从静态资源中获取样式。

有人能帮我解决这个问题吗?谢谢!


你尝试过这个吗?public static readonly DependencyProperty TitleStyleProperty = DependencyProperty.Register( nameof(TitleStyle), typeof(Style), typeof(OpacityMask), new PropertyMetadata(Application.Current.Resources["UrlDescriptionStyle"])); - Archana
是的,我做了...问题是我创建的控件在一个单独的项目(类库)中,与应用程序不同。因此,我定义的静态资源在应用程序资源中不存在,我需要在类库本身中定义我的默认样式,为此我尝试在与控件模板派生自相同的资源字典中定义这些内容,但似乎找不到那个。 - KNara
尝试在控件的样式中设置值?例如<Setter Property="DescriptionStyle" Value="{StaticResource UrlDescriptionStyle}"/> - Archana
不确定这该怎么做...我需要将这个特定的样式应用到自定义控件内定义的一个控件上...而且它会变成硬编码,对吧?它将无法应用从 Application xaml 分配的任何样式属性。 - KNara
你可以在XAML中稍后更改它的值。如果将其变为硬编码,它将成为默认值。如果您不分配任何值,则将采用此值。 - Archana
显示剩余2条评论
1个回答

2
您可以在控件的样式中为属性设置默认值,就像这样。
<Style TargetType="local:MyHyperlink">
<Setter Property="DescriptionStyle" Value="{StaticResource UrlDescriptionStyle}"/>
...
</Style>

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