【问题标题】:How can I access a named element of a ControlTemplate through code-behind?如何通过代码隐藏访问 ControlTemplate 的命名元素?
【发布时间】:2016-07-06 19:35:48
【问题描述】:

我想在代码隐藏中访问另一个元素正在使用的原始控件模板中的一个命名元素。

这是一个 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 做错了吗?任何帮助将不胜感激!

【问题讨论】:

    标签: c# wpf xaml controltemplate


    【解决方案1】:

    你需要等到模板应用到控件上

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

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

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

    【讨论】:

    • 谢谢,但这不起作用(grid 仍然是null)。我将研究 Lookless Controls,我发现我对 WPF 的理解几乎没有我想象的那么好。作为临时修复,我想我会避免使用模板,而只是重复使用相同的代码,直到我有时间更详细地查看那篇文章。
    • @Debra 是的,这不是你的错。需要数年的时间才能获得所需的所有学科,以使一切都很好地融合在一起。这些技术确实混合了一点,但是一旦你开始用它们做复杂的事情,就会开始出现不稳定的事情。如果我可以为您指明一个方向,那就是学习 MVVM 架构并学习如何构建无外观控件。你会感谢自己,并且比大多数人走得更远。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 2011-01-08
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多