【问题标题】:Accessing a 3rd-party ContentTemplate-internal control访问第 3 方 ContentTemplate 内部控件
【发布时间】:2012-08-15 13:14:59
【问题描述】:

我正在使用第 3 方控件(在本例中为 Telerik 的 RadChart 控件),它具有包含图表的多个元素的复杂内部 ControlTemplate。不幸的是,并非所有部分都明确地暴露给我的样式,我发现自己想通过 XAML 或通过代码在 ControlTemplate 内的特定子元素上设置属性。在与 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 的内部 Template 属性中找到 PART_AxisX。

所以我的问题是: 1)我在这里做错了什么? 2)有没有更好的方法来解决这个问题,而不是像这样迂回?

【问题讨论】:

  • 您是否在等到加载图表区域?...模板可能尚未应用。应该在 OnAppyTemplate 之后完成。
  • 是的,这确实是问题所在。我访问它有点太早了,但我认为到那时一切都会加载。谢谢。当然,Telerik 过于复杂的可视化树确保这并没有帮助我。 :)
  • 你想让我把它变成一个答案,以便它可以打勾?...或将评论转换为答案?...我不知道礼仪。
  • 把它变成一个答案,我很乐意接受它。

标签: wpf


【解决方案1】:

解决方案是等到控件上发生Loaded 事件之后。

当此事件发生时,您知道模板已被应用并且可视化树已为控件构建,因此您可以使用 FindName 访问元素。

这里给出了一个稍微相关的链接,用于在 ContentControl 上使用内容模板时的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多