2016-07-06 1 views
1

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

Это пример кода XAML (очевидно, оригинал является более сложным, или я просто делать это в XAML):

<Window x:Class="Temp.MainWindow" Title="MainWindow"> 
    <Window.Resources> 
     <ControlTemplate x:Key="MyTemplate" TargetType="{x:Type Expander}"> 
      <Expander Header="Some header"> 
       <StackPanel> 
        <Grid Name="MyGrid"/> 
       </StackPanel> 
      </Expander> 
     </ControlTemplate> 
    </Window.Resources> 
    <Grid> 
     <Expander Name="expander" Template="{DynamicResource MyTemplate}"/> 
    </Grid> 
</Window> 

Что я пробовал:

public MainWindow() 
{ 
    InitializeComponent(); 
    Grid grid = expander.Template.FindName("MyGrid", expander) as Grid; 
} 

Я также попытался

Grid grid = expander.Template.Resources.FindName("MyGrid") as Grid; 

Но g всегда null.

Я посмотрел на:

ссылки выше являются, как я получил код я работаю, но по какой-то причине , g всегда всегда null. Я что-то делаю с ContentTemplate? Любая помощь будет оценена!

ответ

1

Вы должны ждать, пока шаблон не будет применен к управлению

protected override OnApplyTemplate() 
{ 
    Grid grid = Template.FindName("YourTemplateName") as Grid; 
} 

Реальная проблема здесь состоит в том, что вы смешиваете технологии. Вы пытаетесь использовать что-то, предназначенное для захвата шаблона беззазорного элемента управления, взади кода главного окна. Я был бы удивлен, если бы у вас не возникло проблем.

Вместо этого я предлагаю посмотреть на How to Create Lookless Controls и перепроектировать ваше приложение. Это не потребует больших усилий, и все будет хорошо сочетаться.

+0

Спасибо, но это не сработало ('grid' по-прежнему' null'). Я посмотрю на «Бесшумные элементы управления», я обнаруживаю, что я не понимаю WPF почти так же хорошо, как я и думал. Как временное исправление, я думаю, что я не буду использовать шаблоны и просто повторяю один и тот же код, пока не найду время, чтобы посмотреть на эту статью более подробно. –

+0

@ Да, это не твоя вина. Чтобы получить все необходимые дисциплины, требуется много лет, чтобы все было хорошо вместе. Технологии немного смешиваются, но как только вы начинаете заниматься сложными вещами, они начинают разрастаться. Если бы я мог указать вам в направлении, то нужно было бы изучить архитектуру MVVM и научиться строить бесполезные элементы управления. Вы будете благодарить себя и быть ближе к большинству. –

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