OnApplyTemplate не вызывается в пользовательском элементе управления - PullRequest
16 голосов
/ 30 мая 2010

У меня есть пользовательский элемент управления, который использует некоторые элементы управления PART:

 [TemplatePart(Name = "PART_TitleTextBox", Type = typeof(TextBox))]
    [TemplatePart(Name = "PART_TitleIndexText", Type = typeof(Label))]
    [TemplatePart(Name = "PART_TimeCodeInText", Type = typeof(TextBlock))]
    [TemplatePart(Name = "PART_TimeCodeOutText", Type = typeof(TextBlock))]
    [TemplatePart(Name = "PART_ApprovedImage", Type = typeof(Image))]
    [TemplatePart(Name = "PART_CommentsImage", Type = typeof(Image))]
    [TemplatePart(Name = "PART_BookmarkedImage", Type = typeof(Image))]
    public class TitleBoxNew : Control
    {
        static TitleBoxNew()
        { 
            DefaultStyleKeyProperty.OverrideMetadata(
                typeof(TitleBoxNew),
                new FrameworkPropertyMetadata(typeof(TitleBoxNew)));
        } 

        public TitleBoxNew() { }

        // ... rest of class
    }

Этот элемент управления переопределяет OnApplyTemplate:

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

      InitializeEvents();
}

Что работает хорошо, большую часть времени. Я добавил элемент управления в пользовательский элемент управления вкладками в окне, и почему-то никогда не вызывается OnApplyTemplate для этого элемента управления! Почему это не работает, как я ожидаю?

Ответы [ 5 ]

39 голосов
/ 02 марта 2012

Для всех, кто может наткнуться на этот пост, у меня возникла та же проблема, и мне удалось ее решить, добавив в AssemblyInfo.cs проекта, содержащего мой пользовательский элемент управления, следующее:

[assembly: ThemeInfo(
    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
    //(used if a resource is not found in the page, 
    // or application resource dictionaries)
    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
    //(used if a resource is not found in the page, 
    // app, or any theme specific resource dictionaries)
)]

Шаблон моего элемента управления находится в файле Theme / Generic.xaml в том же проекте, что и элемент управления.

25 голосов
/ 01 мая 2014

Два других ответа верны ... но не полны. Согласно этому посту (и мой опыт решения этой проблемы) есть 4 вещи, которые нужно проверить: (по какой-то причине блоки кода в этом посте не остались бы отформатированными, если бы я использовал цифры или тире ... так букв это)

A. Шаблон и стили элементов управления должны находиться в файле Generic.xaml в папке с именем Themes в корневом каталоге вашего проекта.

B. Убедитесь, что ваши пространства имен правильны в Generic.xaml

C. Установите ключ стиля в конструкторе вашего элемента управления. Также настоятельно рекомендуется поместить следующее в статический конструктор.

 static YourControl()
 {
      DefaultStyleKeyProperty.OverrideMetadata(typeof(YourControl), new FrameworkPropertyMetadata(typeof(YourControl)));
 }

D. Убедитесь, что в вашем файле Assemblyinfo.cs

указано следующее
 [assembly: ThemeInfo(ResourceDictionaryLocation.None, 
 //where theme specific resource dictionaries are located
 //(used if a resource is not found in the     
 // or application resource dictionaries)
 ResourceDictionaryLocation.SourceAssembly 
 //where the generic resource dictionary is located
 //(used if a resource is not found in the page,
 // app, or any theme specific resource dictionaries)
 )]
3 голосов
/ 30 мая 2010

Я не вижу ваш конструктор, но не забудьте установить DefaultStyleKey:

DefaultStyleKeyProperty.OverrideMetadata(typeof(TitleBoxNew), new FrameworkPropertyMetadata(typeof(TitleBoxNew)));
1 голос
/ 17 сентября 2015

Ответ @MoMo правильный, но дополнительно:

E: Ожидается, что Themes / Generic.xaml находится в корне вашего проекта. Если это не так, и ваш Generic.xaml не находится в корне, то вам нужно создать каталог Темы с Generic.xaml в корне (Generic.xaml имеет тип ResourceDictionary). В этом Generic.xaml вам нужно указать местоположение вашего Generic.xaml.

например:

<ResourceDictionary Source="/Foo.Bar;component/Controls/FooControl/Themes/Generic.xaml" />

1 голос
/ 10 июня 2015

Я собираюсь добавить свой собственный ответ, потому что оба приведенных выше ответа неполны, поскольку я уже некоторое время борюсь с этой проблемой.

Как сказали МоМо и Кай Дж выше:

A. Шаблон и стили элементов управления должны быть расположены в Generic.xaml файл папка под названием Темы корня вашего проекта.

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

C. Установите ключ стиля в конструкторе вашего элемента управления.

D. Убедитесь, что атрибут темы находится в файле assemblyinfo.cs

НО вам также нужно убедиться, что для вашего файла Generic.xaml для Действия сборки задано Страница: Не копировать. Если вам не удастся это сделать или если каким-то образом будет установлено значение, отличное от этого, метод OnApplyTemplate() не будет вызываться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...