0

ユースケースの診断でMVVMパターンに関する質問がありますか。

私がこれまでに持っているのは、私の形であるアイテムのリストです。

ObservableCollection<ItemsViewModels> Items;

とアイテムの接続のコレクション

ObservableCollection<ConnectionViewModel>

各ItemViewModelにはIDがあり、ConnectionViewModelにはアイテムを接続するための2つのIDがあります。

私のItemsViewModelコレクションは、Canvas上のレイアウトであるItemscontrolにバインドされています。

ElementMouseDragBehaviorを使用すると、アイテムをドラッグできます。ここで私の大きな質問があります=)アイテムを移動でき、アイテムが直線またはベジェのいずれかの線で接続されたままになるという接続をどのように視覚化できますか。

mvvmパターンでそれを抽象化する方法がわかりません。

助けてくれてありがとう...

4

3 に答える 3

2

これはあなたに役立ちますか?:Silverlight用のSpiderWebControl

ソースが提供され、次の機能がリストされています

  • ノードの追加、削除、名前の変更
  • ノードのドラッグ
  • Ctrlキーを押しながらドラッグして、サブツリー/ブランチをドラッグします
  • Ctrlキーを押しながらキャンバスをドラッグして、パンします
  • VSMを使用した選択とホバー
  • アニメーション付きのシンプルな自動レイアウト

正確にあなたが求めていたものではないかもしれませんが、それはあなたに出発点を与えるかもしれません。

ジョン

于 2010-05-04T00:40:22.290 に答える
0

これを実現するには多くの方法があります。ただし、Silverlight を使用すると、レイアウトと接続線の描画に関するいくつかの課題が残ります。WPF では、装飾レイヤーを使用して線をそのようにレンダリングすることを検討します。ただし、Silverlight には装飾レイヤーが直接ありませんが、エミュレートすることはできます (ただし、以下の提案では、装飾レイヤーに対する別のアプローチを提案しています)。

これが、問題を解決して問題を解決することを検討する1つの方法です。

  1. MouseDragElementBehavior には、要素が移動中または新しい場所に移動したことを示すイベントがないようです。
    • また、ドラッグされたオブジェクトがキャンバス内に含まれるように設定されている場合、いくつかの主要なドラッグ バグがあるように見えるので、それを使用するかどうかはわかりません。
  2. 独自のドラッグ可能なサーフェスを作成します ( Panelから派生)。独自のマウス処理と、MeasureOverride および ArrangeLayout オーバーライドを備えたカスタム パネルを実装する必要があります。Silverlight でのレイアウトの詳細については、 こちらを参照してください。
    • キャンバスをドラッグするような体験をシミュレートすることは、実際には測定や配置にそれほど多くの課題がないため、比較的簡単です. 形状の位置を含む添付プロパティを作成するか、実際に位置を形状オブジェクトに追加する必要があります。これらの値を形状オブジェクトに直接保存することが理にかなっている場合は、おそらく後者を使用します。
    • ドラッグ可能にするには、形状のマウスダウン/アップにアタッチしてマウスをキャプチャし、簡単なドラッグ ロジックを実行する必要があります。
    • 必要に応じて、物がドラッグされ、ドラッグが完了したときにイベントを追加します。
    • コントロールがパネルから削除されたら、GC 中に解放されるように、アタッチしたすべてのイベントの配線を外してください。
  3. 2 番目のカスタム パネル (またはユーザー コントロール) を作成します。このパネルは、最初のドラッグ パネルの下に配置されます。このパネルの目的は、接続オブジェクトにバインドすることです (もちろん、元のオブジェクトの位置に直接または間接的にアクセスする必要もあります)。
    • パネルにすると、オブジェクトの接続と位置ごとに線を追加できます。上記のイベントに接続するか、形状の X、Y プロパティ変更イベントに直接接続して、形状の移動に合わせて線オブジェクトを更新できるようにする必要があります。
    • または usercontrol および/または writeablebitmap を使用して線を描画できます。シンプルな線描画アルゴリズムが含まれているため、CodeplexのシンプルなWriteableBitmapEx拡張クラスを確認することをお勧めします。シェイプが更新されるたびに、ビットマップを無効にして接続を再描画する必要があります。
于 2010-03-29T14:07:48.530 に答える
0

私は最近、この記事を実装の基礎として使用して、同様のことを完了しました。

http://www.codeproject.com/KB/WPF/BindingToElementPosition.aspx

それはかなり簡単で、私にとってはうまく機能します。

于 2011-04-01T21:12:29.547 に答える