2009-09-03 7 views
2

私はGraph#ライブラリのデフォルトのグラフビューアを変更しようとしています。ユーザーインターフェイスがひどいからです(境界線の外にノードをドラッグしてみてください!)WPF - ドラッグ可能な/ズーム可能な子を持つパネルを最適に実装するにはどうすればいいですか?

基本設定は次のとおりです。 VertexとEdgeコントロールタイプの子を持つGraphCanvasコントロール(Panelから継承)があります。私が達成したいのは:

  • 内容が画面に収まらない場合、GraphCanvasにはスクロールバーがあります。
  • GraphCanvasは、ドラッグしてスクロールすることもできます(空のスペースをクリックしてドラッグするだけです)。
  • GraphCanvasは(Ctrl +マウスホイールを使用して)拡大/縮小できます。
  • 頂点をドラッグすることができます。頂点がGraphCanvasの現在の境界の外にドラッグされると、境界が拡大されます。スクロールバーにはこれを反映する必要がありますが、頂点がドラッグされている間は現在のビューポートをスクロールしないでください。頂点をドラッグするとGraphCanvasの境界が縮小されますが、ドラッグ操作が完了してからサイズ変更されるまでは同じサイズを維持する必要があります。ドラッグ操作中にビューポートを自動的にスクロールすると、混乱がひどく、ドラッグエラーが発生しやすくなります。私が何を意味しているか知りたいなら、元の実装を見てください。

.NETでかなりの経験がありますが、まだWPFの初心者です。私の現在の試みは、各頂点にそれが望むXY座標を(ネガティブであっても)与え、GraphCanvas上でマウスイベントを処理し、RenderTransformプロパティを変更することによってズーム/スクロールを実装することです。ドラッグするだけで、特定の頂点のXY座標が変更されます(おそらく、全体を再レイアウトして回避することもいいでしょう)。 Scrollbarは、ScrollViewerの中にGraphCanvasを配置し、GraphCanvasにIScrollInfoを実装することで実装されます。

残念ながら、問題があるようです。GraphCanvas自体にマウスイベントが発生するのは、ポイントに背景がある場合のみです。とにかく白い背景が欲しいですが、GraphCanvasの負の座標では背景を描画しないため、マウスイベントに反応しません。私はすべての子コントロール(頂点と辺が)負の座標に移動できるようにすることで、正しいことをやっている場合は、私も思ったんだけど

。これをどのように実装しますか?


を追加しました:次のスクリーンショットをチェックアウト背景の問題について明確にする:あなたはここを参照してください何 http://valts.21.lv/problem/GraphCanvas.png

は、単純なWindowsフォームがその上にWPFホスト制御で形成されます。それにはScrollViewerがあり、ScrollViewerにはその中にGraphCanvasがあります。 GraphCanvasには4つの頂点と6つの辺があります。

GraphCanvasは、ScrollViewerを埋めるように引き伸ばされています。しかし、頂点のいくつかは負の座標になっているので、RenderTransformが適用され、すべてを右にシフトします(TranslateTransform)。それはまた、白い背景ブラシを持っています。

左の灰色の領域に注意してください。それはまだGraphCanvasの一部ですが、バックグラウンドのブラシは何とかそこに出ません。また、私はマウス(ノードではなく、灰色の領域で)を左クリックすると、私はNOTイベントを取得します。白い部分を左クリックすると、すべてのイベントがうまくいきます。

答えて

0

マウスの上のキャンバス・マウスドウンとReleaseMouseCaptureCaptureMouseを呼び出してください。また、キャンバスの背景をtransparentに設定しても、それはまだテスト可能です。

+0

私の質問をよく読めば、これがいつもうまくいかない理由がわかります(ヒント:最後から2番目の段落)。 –

+0

あなたのキャンバスの範囲外で実行しようとしているマウスジェスチャは何ですか? –

+0

多分あなたはスクリーンショットを提供できますか?私はあなたのパラグラフを慎重に読んだのですが、まだ明確ではありません –

0

各要素に「ドラッグ可能な」ビヘイビアを付けることができます。

関連する問題