3

問題:

Window Resources で定義されているRun内の名前付き要素にアクセスしようとしています。FlowDocument意味を明確にするために、次のコードを検討してください。

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

Runここでは、「ru​​n 」という名前の要素にアクセスしようとしています。

私がこれまでに試したこと:

  • 要素の名前を使用してアクセスするだけです。ただし、ウィンドウのリソース内の名前付き要素は、ウィンドウのコンテンツで定義された要素と同じデフォルトのアクセシビリティを持っていないようです。これは、この方法が機能しなかったためです。

  • 要素にキーを追加しようとした後、メソッド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 名前スコープの概念によって管理されます。XAML 名前スコープは一意性を強制するため、FindName を使用すると、その名前のオブジェクトが 1 つだけ存在することが保証されます。対照的に、FindLogicalNode は XAML 名前スコープを無視し、検索中に XAML 名前スコープの境界を超える可能性があります。
于 2012-06-17T04:16:25.753 に答える