3

问题:

我正在尝试访问在窗口资源中定义的命名Run元素。FlowDocument为了澄清我的意思,请考虑以下代码:

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

在这里,我将尝试访问Run名为“run”的元素。

到目前为止我尝试过的:

  • 只需使用元素的名称即可访问它。但是,窗口资源中的命名元素显然不具有与窗口内容中定义的元素相同的默认可访问性,因为这种方法不起作用。

  • 尝试向Run元素添加一个键,然后通过该FindResource()方法访问该元素。不幸的是,似乎无法将键添加到嵌套元素中。

  • 下面的代码,它抛出一个NullReferenceException

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

1 回答 1

3

您可以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 名称范围边界。
于 2012-06-17T04:16:25.753 回答