2016-07-06 70 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')。我会研究Lookless Controls,我发现我不像我以前那样了解WPF。 作为一个临时修复,我想我会避免使用模板,并重复使用相同的代码,直到我有时间更详细地查看该文章。 –

+0

@Debra是啊,这不是你的错。为了让所有的事情都能很好地结合在一起,需要多年时间才能获得所需的所有学科。这些技术确实混合了一些,但一旦你开始与他们做复杂的事情,开始发生不可思议的事情。如果我能指出一个方向,那就是学习MVVM架构,并学习如何构建不寻常的控件。你会感谢你自己,并且比大多数人更进一步。 –

相关问题