0

質問を簡単にするために、単純化されたユースケースについて説明します。

1 つの動的な内部グリッドと、トップ レベルのグリッドの特定のセルに収まる ListBox を含むトップ レベルのグリッドがあるとします。

  1. 最上位の Grid 構造 (TopGrid.xaml) は比較的静的で、内側の Grid を含むセルの動的サイズのみを使用します。

  2. 内部の Grid 構造は動的であり、多くの/不明な種類のコンテンツがありますが、各種類のコンテンツは静的であり、個別の XAML で表すことができます。したがって、InnerGrid_1.xaml、InnerGrid_2.xaml、InnerGrid_n.xaml などがあります。

  3. 実行時に、ListBox の選択に応じて、特定の InnerGrid が表示されます。

私はそれを行う2つの方法を考えています:

  1. コード内の XAML を実行時にテキスト編集する: コード内で、XmlDocument を使用して TopGrid.xaml を編集し、特定の InnerGrid_x.xaml のコンテンツを追加して、最終的なインメモリ TopGrid.xaml を作成します。次に、XamlReader を使用して最終的な TopGrid.xaml をビジュアル ツリーに読み取り、そのツリーを LayoutRoot に追加して表示します。

  2. ビジュアル ツリーの操作 (テキスト編集なし): コードでは、XamlReader を使用して TopGrid.xaml をトップ ビジュアル ツリーに読み取り、InnerGrid_x.xaml をサブ ビジュアル ツリーに読み取ります。次に、VisualTreeHelper を使用して、トップ ビジュアル ツリーで TopGrid 要素を見つけ、サブ ビジュアル ツリーで InnerGrid 要素を見つけます。次に、サブビジュアル ツリーをトップ ビジュアル ツリーに追加します。次に、結合されたツリーを LayoutRoot に追加して表示します。

最初の方法が機能することはわかっていますが、コード内で複雑な XML 操作 (またはテキスト編集) が必要です。2 番目の方法が必要ですが、うまくいくかどうかはわかりません。特に、TopGrid のセルのサイズを変更して、動的な InnerGrid を保持するようにします。

誰かがこれを行い、光を当てることができますか? またはより良い解決策はありますか?

副次的な質問: 動的に読み込まれた XAML は、XAML 内でイベント ハンドラーを指定できないようです (私のテスト)。ツリーを作成した後、イベント ハンドラーを動的に設定する必要があります。本当?

4

1 に答える 1

1

WPF の方法は、データにバインドし、WPF にビジュアル ツリーを解決させることです。

<Grid>
    ...
    <ContentControl Content="{Binding SomeData}"/>

DataTemplateコンテンツをレンダリングするために、WPF はバインドされたデータのタイプに一致するものを探します。したがって、持っているデータの種類ごとに、次のように定義しますDataTemplate

<DataTemplate DataType="...">
    <!-- your visual tree representing the data goes here -->
</DataTemplate>

ContentTemplateプロパティを指定することで、WPF にデータの表現方法を明示的に伝えることもできます。

<ContentControl Content="{Binding SomeData}" ContentTemplate="{StaticResource MyContentTemplate}"/>

TLDR: 提案されたアプローチはどちらも慣用的な WPF ではありません。データのテンプレート化を検討する必要があります。

于 2013-01-17T12:17:07.887 に答える