访问窗口资源内的命名元素

2024-04-21

Problem:

我正在尝试访问一个名为Runa 内的元素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";
    

您可以使用LogicalTreeHelper.FindLogicalNode http://msdn.microsoft.com/en-us/library/system.windows.logicaltreehelper.findlogicalnode.aspx as

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

上面链接的备注:

  • 搜索方向为查找逻辑节点朝向子对象(下树);的搜索方向FindName方法是 朝向父对象(上树).
  • FindName 方法由 XAML 名称范围的概念控制。使用 FindName 可以保证只有一个对象 该名称存在,因为 XAML 名称范围强制唯一性。在 对比,FindLogicalNode 忽略 XAML 名称范围并且可能会跨越XAML 搜索期间的名称范围边界。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

访问窗口资源内的命名元素 的相关文章

随机推荐