如何通过代码隐藏访问ControlTemplate的命名元素?

时间:2016-07-06 19:35:49

标签: c# wpf xaml 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 个答案:

答案 0 :(得分:1)

您需要等到模板应用到控件

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

这里真正的问题是你正在混合技术。您正试图在主窗口的后台代码中使用用于抓取无外观控件模板的内容。如果你没有遇到更多问题,我会感到惊讶。

相反,我建议调查How to Create Lookless Controls并重新设计您的应用程序。它不会花费太多精力,而且一起玩得很好。