我正在使用第三方控件(在本例中为Telerik的RadChart控件),它具有复杂的内部ControlTemplate,它包含图表的多个元素。不幸的是,并非所有部分都明确地暴露给我样式,我发现自己想要在ControlTemplate中的特定子元素上设置属性,可以通过XAML或通过代码。在与XAML挣扎了一段时间之后,我选择了以代码为中心的方法,但我仍然陷入困境。
使用Snoop,我可以看到最顶层的ChartArea控件(我可以访问)呈现一个名为PART_AxisX的AxisX2D对象,后者又有一个包含PART_AxisLabels对象的模板,这是我需要设置的样式。 (顺便说一句,我想要设置的属性是AlternationCount,但我找不到一种不太常见的方法来获取它。)
我尝试使用ControlTemplate.FindName
方法(如图here所示)获取AxisX2D对象,然后再使用该对象获取AxisLabels对象,但FindName始终返回null:
var chartArea = myChart.DefaultView.ChartArea;
var visualAxisX = chartArea.Template.FindName("PART_AxisX", chartArea) as AxisX2D;
尽管Snoop确认chartArea
实际上是AxisX2D的TemplatedParent
。我检查了调试器,我可以在chartArea的内部模板属性中找到PART_AxisX。
所以我的问题是: 1)我在这做错了什么? 2)有没有更好的方法来解决这个问题,而不是像这样的迂回?
答案 0 :(得分:1)
解决方案是等到控件上发生Loaded
事件后。
当发生此事件时,您知道已应用模板并且已为控件构建可视树,因此您可以使用FindName访问元素。
此处给出了与在ContentControl上使用内容模板时的相关链接。