如何使这个装饰的Label控件工作?

时间:2018-05-10 19:56:33

标签: c# wpf user-controls

我觉得这应该是一件简单的事,但显然我做的事情是愚蠢的。

我正在尝试使用UserControl(枚举)创建一个DependencyProperty来控制它是否只是逐字地显示其Content属性中提供的文本,或者附加一些额外的文本。

用户控件:

<UserControl x:Class="Controls.UserControls.IndicatorLabel"
             x:Name="indicatorLabel"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:enum="clr-namespace:MyNamespace;assembly=EnumAssembly">
    <Label>
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding Content, ElementName=indicatorLabel}" />
            <TextBlock FontStyle="Italic"
                       Margin="5,0,0,0">
                <TextBlock.Style>
                    <Style TargetType="TextBlock">
                        <Setter Property="Visibility"
                                Value="Collapsed" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding IndicatorType}"
                                         Value="{x:Static enum:LabelIndicator.Optional}">
                                <Setter Property="Text"
                                        Value="(Optional)" />
                                <Setter Property="Visibility"
                                        Value="Visible" />
                            </DataTrigger>
                            <DataTrigger Binding="{Binding IndicatorType}"
                                         Value="{x:Static enum:LabelIndicator.Required}">
                                <Setter Property="Text"
                                        Value="(Required)" />
                                <Setter Property="Visibility"
                                        Value="Visible" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </TextBlock.Style>
            </TextBlock>
        </StackPanel>
    </Label>
</UserControl>

UserControl的代码隐藏:

public partial class IndicatorLabel : UserControl
    {
        public static DependencyProperty IndicatorTypeProperty = DependencyProperty.Register("IndicatorType", typeof(LabelIndicator), typeof(IndicatorLabel));
        public LabelIndicator IndicatorType
        {
            get => (LabelIndicator)GetValue(IndicatorTypeProperty);
            set => SetValue(IndicatorTypeProperty, value);
        }

        public IndicatorLabel()
        {
            InitializeComponent();
        }
    }

在另一个XAML页面中使用UserControl:

<uc:IndicatorLabel Grid.Row="4"
                   Content="Description"
                   IndicatorType="Optional" />

我希望看到:说明(可选)

事实上,只要设置了Content属性,我就无法获得UserControl的XAML中的任何内容,只要有任何影响。

修改

我说它没有效果的原因是因为即使在第一个Text的{​​{1}}属性中放置了一个文字字符串,TextBlock属性中的任何内容仍会显示。好像两个Content都没有真正显示出来。

那为什么会这样呢?难道不能使用TextBlock属性作为将文本输入我真正想要显示的部分的方法吗?我在这里打破了关于Content的WPF规则吗?

1 个答案:

答案 0 :(得分:1)

首先关闭;是的,你不想使用Content。你的UC 的XAML真正所说的是:

<UserControl>
    <UserControl.Content>
        ... All that stuff
    </UserControl.Content>
</UserControl>

因此,当您在父XAML中分配内容时,您只需覆盖所有内容。请改用其他属性(如“文本”)。如果不是UserControl而是实际Control(单独的ControlTemplate和所有内容),那么您可以使用该名称

此外,{Binding IndicatorType}正在查看继承的数据上下文。您应该将用户控件的数据上下文设置为自身,或使用x:Reference告诉它查看用户控件本身。