0

私は現在、すべてのケースで機能したい次のコード行を持っています:

var visualWindowContent = (UIElement)window.Content;

このアプローチは、Window.Content が UIElement の場合に機能します。しかし、DataTemplate が適用された非ビジュアル オブジェクトの場合はどうでしょうか。上記のコード行は、不正なキャスト例外をスローします。その場合、ウィンドウのビジュアル コンテンツを取得するにはどうすればよいでしょうか。

編集:最初に VisualTreeHelper.GetChild(window, 0) が null を返したと言いましたが、実際には null ではありませんでした。ここでの目的は、visualWindowContent を AdornerLayer.GetAdornerLayer に渡すことによって、ルート アドナー レイヤーを取得することです。ウィンドウの直接のビジュアル子を渡すと、そのノードがビジュアル ツリー内で十分に深くないため (つまり、AdornerDectorator の子孫)、失敗 (null を返す) であることが判明しました。

4

2 に答える 2

0

@ReedCopsey によってリンクされたページで FindVisualChild メソッドを使用すると、次のように動作するように見えます。

var contentPresenter = FindVisualChild<ContentPresenter>( window );
var visualWindowContent = (UIElement)VisualTreeHelper.GetChild( contentPresenter, 0 );
于 2011-11-18T21:19:04.793 に答える
-1

コンテンツ自体が必要な場合は、オブジェクトを使用できます。

object visualWindowContent = window.Content;

コンテンツは UIElement または実際に割り当てられたオブジェクトになるため、これはすべての場合に機能します。

データ テンプレートを介して作成された要素を見つけようとしている場合は、MSDN の「DataTemplate で生成された要素を検索する」を参照してオプションを確認してください。これは、 を見つけてContentPresenter検査することによって行われContentTemplateます。

于 2011-11-18T20:53:19.973 に答える