2011-02-04 11 views
0

私は数ヶ月間WPFで作業してきましたが、豊富なWinForm、ASP.NET、およびFlexバックグラウンドを持っています。私は、次のようなユーザーコントロールを描画しようとしていますIMAGEWPFとC# - GeneralTransformとUIElement.TransformToVisualの問題

MVVMパターンを使用しています。ユーザーコントロールが最初に読み込まれると、すべてが正しく描画されます。コントロールはキャンバスで構成されています。キャンバスの中には追加されたUIElementsを幾何学的に配置する放射状パネルが存在します。円形のノードは放射状のパネルに描画されます。表示されているポリラインはキャンバスに描かれています。 GeneralTransformとUIElement.TransformToVisualの呼び出しを使用して、PolyLineの終点を取得します。呼び出し内のUIElementがラジアルパネルの青いノードで、ラジアルパネルで変形しているところです。コントロールが初めて読み込まれると、すべてが正しく描画されます。失敗した場合は、MVVMパターンによって図面が更新されたことが通知されます。

システムアップデートに基づいて更新を試みると、すべてのコレクションに適切なデータが含まれていることを確認しました。したがって、MVVMパターンは必要なように動作します。しかし、私が線を描こうとすると、TransformToVisualへの呼び出しは、ロード中に行う値の代わりに0,0の点を返しています。これにより、私のポリラインは、2つのノードを接続するのではなく、コントロールの左上に描画されます。ここで

は、操作の順序です:

1)ユーザーコントロールの負荷がコントロールを描画するために使用私のコレクションを構築します。これらのコレクションはユーザーコントロールに対してローカルに構築され、データはビューモデルに存在する情報のマスターコレクションから取得されます。ユーザコントロールは、リフレッシュメソッド自体をUIリフレッシュブロードキャストメッセージに登録する。

2)ユーザーは、ウィザードを使用して2つの青いノードに接続しようとします。コネクタが保存され、UIの更新メッセージがブロードキャストされます。

3)ユーザーコントロールは、Refreshメソッドを呼び出します。ここで私はキャンバスの子供たちをループし、PolyLinesを取り除いています。私はまた、radialPanel.Children.Clearを呼び出しています。私はロード時に自分のコレクションを構築した同じコードを実行します。その後、OnRenderを呼び出すためのユーザーコントロールを無効にします。 OnRenderはポリラインを描画してノードを接続しようとします。ノードは、常にラジアルパネルに適切に配置されます。

4)ライン接続アクションはOnRenderから呼び出されます。その中で、私はGeneralTransform gt = node.TransformToVisual(radialPanel)を使用しています。この呼び出しは、ユーザーコントロールが「リフレッシュ」されているのに常に0,0を返しますが、常にコントロールの最初の読み込みを処理します。

私は、ネットワーク通知に基づいてユーザーコントロールを更新する方法の問題がかなり肯定的です。私はコントロールをクリアしようとした後、同じロード操作をやり直しましたが、まだ運がありません。私は、InvalidateVisualをユーザコントロールに対して実行し、オーバーライドされたOnRenderですべてをやってみました。依然として0,0が返されます。

誰かがGeneralTransformに何が起きているのか考えている人はいませんか?私は死んでおり、新しい道が助けになるだろう。

答えて

0

私はそれを理解しました。他の誰かがこの問題を扱う場合、私は答えを投稿しています。

問題は、線を描こうとする前に放射状パネルのMeasureOverrideとArrangeOverrideを強制していないことでした。これらの2つが呼ばれなければ、ノードは私のラインを接続する時点で0,0の位置にあります。線を描画する前にそれらを強制的に呼び出すことにより、TransformToVisualは適切に動作します。