4

.NET3.0でWPFを使用しています。

GridViewのCellTemplateとして定義された比較的単純なDataTemplateがあります。DataTemplateのVisualTreeプロパティにFrameworkElementFactoryが含まれていることを期待していますが、GridViewColumnHeader.Clickイベントからアクセスしようとするとプロパティがnullになります。VisualTreeがnullなのはなぜですか?アクセスする必要があります。ListViewの定義は次のとおりです。

<ListView ItemsSource="{Binding Stuff}" GridViewColumnHeader.Click="Header_Click">
    <ListView.View>
        <GridView>
            <GridViewColumn Width="28">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Image Name="statusImage" Width="16" Height="16" Source="../Images/media_play_green_16x16.png"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

そして、これがイベントハンドラーです。

private void Header_Click(object sender, RoutedEventArgs e)
{
    GridViewColumnHeader gvch = e.OriginalSource as GridViewColumnHeader;

    // error! VisualTree is null!
    //gvch.Column.CellTemplate.VisualTree.GetType(); 
}
4

2 に答える 2

7

これは、既知の予想される動作です。現在、MSDN やその他の「信頼できる」引用は見つかりませんが、この MSDN フォーラムの投稿では次のように説明されています。

FrameworkTemplate.VisualTree プロパティ ... コードでプログラムによって DataTemplate/ControlTemplate を作成するときに主に使用されます。XAML を使用して DataTemplate/ControlTemplate を定義する場合、このプロパティは null になります。これは、WPF が別のメカニズムを使用して XAML 生成テンプレートをインスタンス化および構築するためです。 (強調追加)

したがって、VisualTree プロパティは、テンプレートが XAML から読み込まれるときに設定されません。FrameworkElementFactory を使用してコードでテンプレートを構築する場合にのみ設定されます。

XAML で定義されたテンプレートのコンテンツを取得するには、FrameworkTemplate.LoadContent() を呼び出します。これにより、テンプレートのインスタンスが具体化され、ルート要素が提供されます。その後、必要に応じてドリルインし、プロパティまたはバインディングを設定できます。ただし、実体化されたインスタンスをウィンドウまたはコントロールのビジュアル ツリーに挿入するかどうかはユーザー次第なので、おそらくこれをカプセル化することをお勧めします。

于 2010-03-30T23:14:32.373 に答える
0

Of Visual Tree が null である理由は、Visual Tree プロパティがVisual OneではなくLogical Treeに近いためです。テンプレートの実際のコンテンツは、パブリック メンバーを持たないTemplateContentオブジェクトに格納されます。LoadContentメソッドを使用する必要があります。

于 2015-04-21T07:34:47.183 に答える