访问窗口资源的内部命名元素(Accessing named element inside of wi

2019-09-18 05:07发布

问题:

我试图访问一个名为Run一个内部元素FlowDocument这是在Window资源定义。 为了澄清我的意思,考虑如下代码:

<Window.Resources>
    <FlowDocument x:Key="doc">
        <Paragraph>
            <Run x:Name="run" />
        </Paragraph>
    </FlowDocument>
</Window.Resources>

在这里,我会试图访问Run指定元素“运行”。

我已经试过到目前为止:

  • 只需用元素的名称来访问它。 然而,在窗口的资源命名的元素显然不具有相同的默认无障碍作为窗口的内容定义的元素,因为这个方法没有奏效。

  • 试图添加一个关键Run元件,然后通过访问所述元件FindResource()方法。 不幸的是,似乎密钥不能被添加到嵌套元素。

  • 下面的代码,这将引发NullReferenceException

     FlowDocument doc = (FlowDocument)FindResource("doc"); ((Run)doc.FindName("run")).Text = "example text"; 

Answer 1:

您可以使用LogicalTreeHelper.FindLogicalNode作为

 var doc = this.Resources["doc"] as FlowDocument;
 ((Run)LogicalTreeHelper.FindLogicalNode(doc, "run")).Text = "example text";

从上面的链接备注:

  • 对于FindLogicalNode搜索方向是朝子对象( 树倒 ); 为FindName方法搜索方向是朝着父对象( 向上的树 )。
  • 该FindName方法由XAML名称范围的概念支配。 使用FindName可以保证只有一个该名称的对象存在,因为XAML名称范围强制唯一性。 相比之下,FindLogicalNode忽略XAML名称范围 ,并在搜索过程中可能跨越XAML名称范围的边界。


文章来源: Accessing named element inside of window resources