2013-05-03 2 views
4

Я переопределял шаблон элемента управления в ResourceDictionary Generic.xaml. В этом я добавил кнопку, на которой я хотел добавить некоторые события.Is GetTemplateChild Устаревший в .Net 3.5 и какая разница между FrameWorkTemplate.FindName и ControlTemplate.FindName

<Setter Property="Template"> 
    <Setter.Value> 
     --Added my button here. 
    </Setter.Value> 
</Setter> 

Так в Loaded случае управления я сделал

Button b = (Button)mycontrol.Template.FindName("PARTName", mycontrol) 

//Add Events on my button 

Некоторые где на Интернете я прочитал, что я могу сделать

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

    UIElement editingelement = GetTemplateChild("PART_EditingElement"); 
    if (editingelement != null) 
    { 
     // do something 
    } 
} 

Когда я попытался сделать это предложение для GetTemplateChild говорит Do Not Используйте.

enter image description here

Так что мой вопрос

  1. Почему бы не использовать GetTemplateChild. Это устарело? И

  2. В чем разница между FrameWorkTemplate.FindName и ControlTemplate.FindName?

+0

Чтобы ответить на ваш вопрос 2.. 'ControlTemplate' наследует' FrameworkTemplate', поэтому разница не имеет ничего общего. Посмотрите [здесь] (http://msdn.microsoft.com/en-us/library/system.windows.controls.controltemplate.aspx) –

+0

[Причина найдена здесь] (http://msdn.microsoft.com/ru -us/библиотека/system.windows.frameworkelement.gettemplatechild.aspx) – noobob

ответ

4

1.

Единственное отличие состоит в том, что GetTemplateChild вернется null когда:

  • нет шаблона не существует, или
  • именованный объект существует, но не является DependencyObject (я дон Не знаю, возможно ли это вообще.

В противном случае, этот код:

this.GetTemplateChild(name) 

буквально эквивалентен этот код:

this.Template.FindName(name, this) 

Я не знаю, почему это было отмечено как "Не использовать". Я заметил, что эта заметка существовала на странице MSDN для version 3 и была удалена с version 3.5, но я не знаю, означает ли это что-либо.


2.

вы имели в виду FrameworkElement? Как сказал Йенс, ControlTemplate наследует FrameworkTemplate, и оба они используют метод FrameworkTemplate.FindName. Но FrameworkTemplate.FindName и FrameworkElement.FindName отличаются. FrameworkElement.FindName только просматривает дочерние элементы, но не шаблон, в то время как FrameworkTemplate.FindName только смотрит на собственные элементы шаблона, но не на родительский элемент, к которому он применяется.