2012-06-17 19 views
3

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

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

<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"; 
    

回答

2

您可以使用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 名称范围边界。