WPF OnApplyTemplate для производного класса ItemsControl не вызывается - PullRequest
1 голос
/ 04 июня 2011

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

Вот упрощение моего кода:

<!-- CustomItemsControl.xaml -->
<ItemsControl x:Class="myNamespace.CustomItemsControl"
              xmlns:local="clr-namespace:myNamespace">

    <ItemsControl.Resources>    
        <Style TargetType="{x:Type local:CustomItemsControl}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type local:CustomItemsControl}">
                        <Grid x:Name="MyItemsHost" Background="{TemplateBinding Background}" IsItemsHost="True"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ItemsControl.Resources>
</ItemsControl>

// CustomItemsControl.xaml.cs
namespace myNamespace
{
    public partial class CustomItemsControl : ItemsControl
    {
        public CustomItemsControl()
        {
            this.DefaultStyleKey = typeof(CustomItemsControl);
        }

        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            var MyItemsHost = (Grid)base.GetTemplateChild("MyItemsHost");
        }
    }
}

Что я 'я делаю неправильно?

Ответы [ 2 ]

1 голос
/ 09 августа 2011

В зависимости от того, из чего происходит ваш пользовательский элемент управления, вы не сможете вызывать InitializeComponent () для него.Например, ContentControl не предоставляет InitializeComponent.

Если вы проверите этот поток, вы увидите, что причина, по которой OnApplyTemplate никогда не вызывается, в том, что вы определили проект как классБиблиотека, а не библиотека пользовательских элементов управления.Visual Studio добавляет дополнительную информацию в AssemblyInfo.cs, чтобы сообщить среде выполнения, где найти шаблон для вашего элемента управления.

Если вы добавите следующий код в файл 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)

)]

1 голос
/ 05 июня 2011

Я не видел, чтобы это делалось таким образом раньше, я определяю шаблон в Generic.xaml, поскольку именно это генерирует Visual Studio, когда вы идете Project-> Add Custom Control (WPF).

Вы можете заставить опубликованный код работать, вызвав InitializeComponent(); в своем конструкторе.Также в документации сказано, что вы должны использовать Template.FindName("MyItemsHost",this) вместо GetTemplateChild.Если вашему элементу управления может потребоваться другой макет, отличный от сетки, вы можете использовать ItemsPresenter и установить вместо него ItemsPanelTemplate.

...