Пользовательский расширенный элемент управления не отображается

Я создал этот элемент управления в WPF:

[ContentProperty("Text")]
[DefaultProperty("Text")]
public class TextElement : Control {

    public static readonly DependencyProperty TextProperty =
        DependencyProperty.Register("Text", typeof(string), 
        typeof(TextElement), new PropertyMetadata(default(string)));

    public static readonly DependencyProperty LabelProperty =
        DependencyProperty.Register("Label", typeof(string), 
        typeof(TextElement), new PropertyMetadata(default(string)));

    [Bindable(true)]
    public string Text {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }

    [Bindable(true)]
    public string Label {
        get { return (string)GetValue(LabelProperty); }
        set { SetValue(LabelProperty, value); }
    }
}

Кроме того, я определил шаблон по умолчанию для элемента управления в /Themes/Generic.xaml в проекте:

<Style x:Key="{x:Type local:TextElement}" TargetType="{x:Type local:TextElement}">
    <Setter Property="SnapsToDevicePixels" Value="True"/>
    <Setter Property="HorizontalAlignment" Value="Stretch" />
    <Setter Property="HorizontalContentAlignment" Value="Left"/>
    <Setter Property="VerticalAlignment" Value="Stretch" />
    <Setter Property="VerticalContentAlignment" Value="Top" />
    <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrush}}"/>
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrush}}"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:TextElement}">
                <Grid HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
                      VerticalAlignment="{TemplateBinding VerticalAlignment}"
                      SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                      Background="Yellow"
                      Width="100" Height="30">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="55"/>
                        <ColumnDefinition Width="66"/>
                    </Grid.ColumnDefinitions>
                    <Label Grid.Column="0" x:Name="label" Background="Red" Height="20" Width="20"
                           HorizontalAlignment="Stretch"
                           HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
                           VerticalAlignment="Stretch"
                           VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
                           Content="{TemplateBinding Label}"
                           Style="{TemplateBinding LabelStyle}"/>
                    <ContentPresenter />
                    <TextBlock Text="{TemplateBinding Text}"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Но когда я использовал его в представлении, он не отображается. Где я не прав? Любая идея, пожалуйста?


person agent47    schedule 26.07.2013    source источник


Ответы (2)


вам необходимо переопределить метаданные DefaultStyleKey, как показано ниже, чтобы указать, что вы определили стиль в Generic.xaml

DefaultStyleKeyProperty.OverrideMetadata(typeof(TestItemsControl), new FrameworkPropertyMetadata(typeof(TestItemsControl)));

Добавьте этот код в статический конструктор вашего элемента управления.

person Sivakumar    schedule 26.07.2013
comment
Спасибо, я тоже нашел проблему :D. Но, чтобы сказать спасибо, я приму и проголосую за ваш ответ. Ваше здоровье - person agent47; 26.07.2013

Упс! Я нашел проблему. Я просто забыл переопределить метаданные. Поместите это сюда, чтобы помочь кому-то еще, если у него такая же проблема.

// in static .ctor
static TextElement() {
    DefaultStyleKeyProperty.OverrideMetadata(
        typeof (TextElement), new FrameworkPropertyMetadata(typeof (TextElement)));
}
person agent47    schedule 26.07.2013