OnApplyTemplate() не вызывается, материал в свойстве шаблона также не отображается

#c# #wpf #silverlight #templates #controls

#c# #wpf #silverlight #шаблоны #элементы управления

Вопрос:

У меня есть следующий класс:

 namespace Controls
{
    public class DropDownButton : Control
    {
        public DropDownButton()
        {
            this.DefaultStyleKey = typeof(DropDownButton);
        }

        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
        }
    }
}
 

И в XAML:

 <Style TargetType="Controls:DropDownButton">
    <Setter Property="FontSize" Value="10"/>
    <Setter Property="Height" Value="202"/>
    <Setter Property="Foreground" Value="White"/>
    <Setter Property="VerticalAlignment" Value="Center"/>

    <Setter Property="Template">
        <Setter.Value>
            <Button Content="Button1">
                <Button.Template>
                    <ControlTemplate TargetType="Button">
                    </ControlTemplate>
                </Button.Template>
            </Button>
        </Setter.Value>
    </Setter>
    <Setter Property="MinWidth" Value="65"/>
</Style>
 

У меня есть две проблемы (возможно, связанные): кнопка в xaml не отображается в элементе управления, и у элемента управления вообще не вызывается функция OnApplyTemplate() . Единственное, на что, по-видимому, реагирует элемент управления, — это установка его размеров…

Комментарии:

1. Вы действительно устанавливаете шаблон на кнопку, а не на элемент управления, содержащий кнопку?

2. Template ожидает шаблон элемента управления, но в вашем Setter.Value у вас есть Button . Я бы ожидал какого-то исключения.

3. оооо, я попытался обернуть его в теги ControlTemplate, и это сработало.. Раньше я не получал исключений, хотя это странно…

4. Итак, это ответило на вопрос? Если это так, я мог бы опубликовать его в качестве ответа…

5. да, продолжайте, и я отмечу это как ответ.

Ответ №1:

Template Отсутствует его элемент ControlTemplate :

 <Setter Property="Template">
    <Setter.Value>
        <ControlTemplate> <!-- This -->
            <Button Content="Button1">
                <!-- ... -->
            </Button>
        </ControlTemplate>
    </Setter.Value>
</Setter>