2013-05-30 3 views
2

ШаблонWPF Template.FindName возвращение всегда нуль

<Style TargetType="{x:Type local:Viewport}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:Viewport}"> 
       <Border Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}"> 
        <ItemsPresenter/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="ItemsPanel"> 
     <Setter.Value> 
      <ItemsPanelTemplate> 
       <Canvas x:Name="PART_Canvas" IsItemsHost="True"/> 
      </ItemsPanelTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

А код в OnApplyTemplate

content = this.Template.FindName("PART_Canvas", this) as FrameworkElement; 

возвращается содержание всегда нуль, почему он не работает?

, если я заменю с этим, программа завершает работу непосредственно

content = this.ItemsPanel.FindName("PART_Canvas", this) as FrameworkElement; 
+1

Что такое 'this'? – sircodesalot

+0

В методе OnApplyTemplate попробуйте что-то вроде content = (Canvas) GetTemplateChild ("PART_Canvas") и посмотрите, работает оно или нет. – Sai

+0

@Sai GetTemplateChild не работает. Полотно находится в ItemsPanel. Я не знаю, как я могу получить к нему доступ. – Enzojz

ответ

7

С FindName вы можете найти только элементы, объявленные в Template. ItemsPanel не является частью этого шаблона. ItemsControl пут ItemsPanel в держатель ItemsPresenter места, через который вы можете получить доступ к Canvas но сначала вам нужно назвать ItemsPresenter в шаблоне:

<ControlTemplate TargetType="{x:Type local:Viewport}"> 
    <Border> 
     <ItemsPresenter x:Name="PART_ItemsPresenter"/> 
    </Border> 
</ControlTemplate> 

затем, используя VisualTreeHelper получить ваши Canvas, но я думаю, что самое раннее место, когда вы можете позвонить коду ниже, когда FrameWorkElement - Loaded. Это мой пример:

public class MyListBox : ListBox 
{ 
    public MyListBox() 
    { 
     AddHandler(FrameworkElement.LoadedEvent, new RoutedEventHandler(ControlIsLoaded)); 
    } 

    private void ControlIsLoaded(object sender, RoutedEventArgs e) 
    { 
     var canvas = VisualTreeHelper.GetChild(this.Template.FindName("PART_ItemsPresenter", this) as DependencyObject, 0); 
    } 
} 
+0

. Привет, в моем настраиваемом элементе управления, конструктор является статическим, поэтому я не могу добавить «AddHandler» в конструктор, но я положил это в «OnApplyTemplate», он работает хорошо. Спасибо! – Enzojz

Смежные вопросы