1

現在、実際のフェリーの海上での位置と貨物の状態を表示するフェリー システムの視覚的表現を作成する必要があります。フェリーにはトラックが含まれ、トラックには車が含まれます。実際のトラックとその XY 位置をデッキに表示する必要があります。フェリーに荷物が積み込まれると、トラックの位置が頻繁に更新されるため、アニメーションが表示されます。また、実際の車をトラックに表示する必要があります。トラック、乗用車、フェリーには、表示する必要のある状態もあります。そのため、かなり現実的な方法で視覚化する必要があるデータの階層構造があります。

WPF でこの種のものを実装する良い方法は何でしょうか? 1 つの TreeView コントロールで MVVM を使用し、海、フェリー、トラック、車用の HierarchicalDataTemplates と TreeView 用の ControlTemplate を作成する必要がありますか? または、ViewModel の監視可能なコレクションにデータバインドするのではなく、UserControls を使用してコードで作成および更新する必要があります。これについて何か経験はありますか?これをどのように行いますか?クラス/コントロールの設定をスケッチしていただけますか?

4

4 に答える 4

4

ユーザー コントロールを作成するのではなく、「ルックレス」コントロールを作成することをお勧めします。通常、私はルックレス コントロールの接着剤/コンテナーとしてユーザー コントロールを使用します。Lookless コントロールの例は、Button クラスです。デフォルトのスタイルが含まれており、Blend ではスタイルを好きなように変更できます。また、ビジュアル ステート マネージャーもサポートしているため、状態が変化したときにプレゼンテーションがどのように見えるかを変更できます。ルックレス コントロールのコード ビハインドは、ミニ ViewModel と考えることができます。ここでは、いくつかのプレゼンテーションとドメイン クラスを混在させても問題ありません

これと同じ設計に従うと、Ferry ルックレス コントロールを作成できます。このコントロールには、独自の依存関係プロパティのセットがあります (おそらく、DP の OnChange をリッスンします)。

Ferry コントロールには、「トラック」と呼ばれる ObservableCollection DP がある場合があります。

次に、Themes\generic.xaml で、Ferry コントロールの既定のスタイルを作成します。デフォルトのスタイルには、ItemsSource={TemplateBinding Trucks} の ItemsControl がある場合があります。ItemsControl パネル テンプレートは、トラックを配置するための独自のカスタム パネルにすることも、キャンバスを使用することもできます。ItemsControl 項目テンプレートの場合、次のようになります。

<DataTemplate>
     <mynamespace:TruckControl/>
</DataTemplate>

トラック コントロールは、独自のデフォルト スタイルを持つルックレス コントロールでもあり、そのデータ コンテキストは既に設定されているため、{Binding Path=xyz} を直接実行できます。トラック コントロールは、Canvas.Left/Top (前の項目コントロールでキャンバスを使用することを選択した場合..またはカスタム パネルを作成した場合、その位置をまったく設定しない場合) またはレンダリングを設定することもできます。正しい X、Y に配置するように変換します。また、トラックのテンプレートで項目コントロールを使用して、フェリー コントロールでトラックをレンダリングしたのと同じ方法で車をレンダリングすることもできます。また、VisualStateManager の状態を作成して、Blend を完全にサポートできるようにすることもできます。したがって、トラックが「問題のある状態」になった場合、たとえば、その状態をブレンドで簡単にスタイリングして、赤く点滅させることができます。

消化するのは大変なことのように聞こえるかもしれませんが、MVVM モデルをサポートするすべてのスタイル設定可能なコントロールを持つことで、あなたの生活は 1000000 倍楽になります。

Microsoft の Silverlight ツールキットを調べて、ルックレス コントロールなどを行う方法を理解することをお勧めします。DatePicker ( http://silverlight.codeplex.com/SourceControl/changeset/view/25992# )のような単純なコントロールを見てみてください。1 つの注意点は、DatePicker.xaml ファイルを無視することです (これは、ジェネリックに入れられるものの単なるミラーです。 xaml を削除しただけでは何も問題はありません)。

細心の注意を払う必要があるのは、次のとおりです。

1.) クラスの属性。これらは、Blend がコントロールを処理する方法を知るのに役立ちます。

2.) OnApplyTemplate オーバーライド。ここで、テンプレートから特定の要素を引き出すことができます。これらは「パーツ」と呼ばれ、Blend にパーツ タブが表示されます。#1 の属性は、テンプレートに含まれる「パーツ」と、それらが期待されるタイプを定義できます。

3.) コンストラクターの DefaultStyleKey = typeof(...)。これにより、generic.xaml で使用する既定のテンプレートが Silverlight に通知されます。

4.) Themes\generic.xaml を見てください。これは、すべての既定のテンプレートを格納する特別なハードコードされたファイルの場所です。DatePicker スタイルを検索すると、アイデアが得られます:)

幸運を!

于 2009-08-24T06:32:46.200 に答える
2

実際にどのように実装したかをお知らせしたいと思います。このためにカスタムコントロールまたはUserControlを作成する必要はまったくないことが判明しました。私がしたのは、車、船、フェリー、トラックなどのViewModelsのデータテンプレートを作成することだけでした。たとえば、FerryViewModelのデータテンプレートには、CanvasタイプのItemsPanel(トラックを配置できるようにするため)を持つItemsControlと、TruckViewModelのDataTemplateであるItemTemplateが含まれていました。非常にシンプルで高速なアプローチ。

于 2009-09-05T18:57:11.817 に答える
1

1つのユーザーコントロールですべての描画を処理することをお勧めします。そうしないと、オブジェクトの階層が失われる可能性があります。また、車、トラック、フェリーに乗っている人など、別のアイテムが追加された場合も簡単になります。

モデルが階層的である場合は、トップレベルをコントロールに渡すだけで、コントロールを並べ替えることができます。

MVVMは既存のコントロールに対して適切に機能しますが、既存のWPFコントロールは、必要なものに近いコントロールがあり、いくつかの調整を加えるだけで機能する場合にのみ機能します。必要なものに近いWPFの標準コントロールを考えることができないので、新しいコントロールを作成するときが来ました。

于 2009-08-23T04:32:40.117 に答える
0

WPF は、ビュー モデルで非常にうまく機能します。特に必要になるまでコードを隠しておくことができれば、UI をデータから簡単に分離できます。データモデルが異なるディスプレイ間で変わらない場合、UI をよりアップグレード可能にすることができます。

于 2009-08-22T10:52:35.577 に答える