问题:
我正在尝试访问窗口资源中定义的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";
答案 0 :(得分: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 搜索期间的名称范围边界。