如何从代码隐藏中访问控件模板的元素

Posted

技术标签:

【中文标题】如何从代码隐藏中访问控件模板的元素【英文标题】:How do I access an element of a control template from within code-behind 【发布时间】:2011-12-28 22:16:18 【问题描述】:

我正在尝试访问内容控件的控件模板内的用户控件。具体来说:

  <ContentControl x:Name="MyList" >
        <ContentControl.Template>
            <ControlTemplate x:Name="MyControlTemplate">
                <Border RenderTransformOrigin="0,0" x:Name="border">
                    <UserControls:MyControl x:Name="MyControlName" Width="100" ViewModel="Binding" />

我可以访问 this.MyList 但它说 this.MyControlName 找不到。在这种情况下如何从代码隐藏访问 MyControlName 对象?

谢谢!

【问题讨论】:

我觉得你更应该说出你想要达到的目标,很有可能你不必按照你的要求去做。 【参考方案1】:

您需要获取模板并在模板化控件上按名称定位控件,例如:

var template = MyList.Template;
var myControl = (MyControl)template.FindName("MyControlName", MyList);

模板就是:对要创建的内容的抽象描述,模板中的控件仅存在于正在模板化的内容的上下文中。


请注意,如果您正在创作模板所针对的控件,则您应该只访问 控件模板 中的元素。从外部访问应该通过绑定的属性和方法来完成。

对于数据模板,这是类似的。您需要访问的所有内容都应该绑定到一个对象,然后应该通过该对象进行访问。在虚拟化其项目的项目控件的情况下尤其如此,因此这些元素在大多数情况下甚至都不存在。

【讨论】:

出色的作品。解决了我在 ContextMenuControlTemplate 中访问控件的问题。我花了几个小时试图提出一个比网上建议的几个更简单的解决方案。你的两个班轮把我带到了我想去的地方。感谢您分享您的知识并向像我这样的读者解释。【参考方案2】:

你也可以通过在控件中添加 Loaded 事件,然后在代码中将事件的发送者分配给某个变量来从每个模板中获取控制权。

【讨论】:

我的控制被深深地埋在了一系列样式和自定义模板中,这个事件救了我。谢谢。

以上是关于如何从代码隐藏中访问控件模板的元素的主要内容,如果未能解决你的问题,请参考以下文章

如何从继承的用户控件访问 viewModel 依赖属性?

Xamarin Forms - 从父页面代码隐藏的列表视图中访问控件

在 c# Razor 6.0 页面上的代码隐藏中访问 Html 控件

如何从代码隐藏c#中显示隐藏的div

如何从代码隐藏中访问UserControl中样式的Setter中ControlTemplate中定义的Control实例?

WPF ComboBox控件隐藏倒三角