2

Graph# ライブラリのデフォルトのグラフ ビューアを変更しようとしています。これは、そのユーザー インターフェイスがひどいためです (ノードを境界の外にドラッグしてみてください!)

基本的なセットアップは次のとおりです。Vertex および Edge コントロール タイプの子を持つ GraphCanvas コントロール (Panel から継承) があります。私が達成したいことは次のとおりです。

  • コンテンツが画面に収まらない場合、GraphCanvas にはスクロール バーがあります。
  • GraphCanvas は、「ドラッグ」してスクロールすることもできます (空のスペースをクリックしてドラッグするだけです)。
  • GraphCanvas は (CTRL+マウス ホイールを使用して) ズームインおよびズームアウトできます。
  • 頂点はドラッグできます。頂点が GraphCanvas の現在の境界の外にドラッグされると、境界が増加します。スクロール バーはこれを反映する必要がありますが、頂点がドラッグされている間は現在のビューポートがスクロールして離れないようにする必要があります。頂点をドラッグすると GraphCanvas の境界が縮小する場合も同様です。ドラッグ操作が終了するまで同じサイズを維持し、その後でサイズを変更する必要があります。ドラッグ操作中にビューポートを自動的にスクロールすると、非常に混乱し、ドラッグ エラーが発生しやすくなります。私の言いたいことを知りたい場合は、元の実装を参照してください。

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

残念ながら、問題があるようです: ポイントに背景がある場合にのみ、GraphCanvas 自体でマウス イベントを取得できます。とにかく白い背景が欲しいのですが、GraphCanvas の負の座標では背景が描画されないため、マウスイベントに応答しません。

また、すべての子コントロール (頂点とエッジ) が負の座標になることを許可することで、正しいことを行っているかどうかも疑問に思っています。これをどのように実装しますか?


追加:バックグラウンドの問題を明確にするために、次のスクリーンショットを確認してください: (ソース: valts.21.lv )

ここに表示されているのは、WPF ホスト コントロールを含む単純な Windows フォーム フォームです。それには ScrollViewer があり、ScrollViewer には GraphCanvas があります。GraphCanvas には 4 つの頂点と 6 つのエッジが含まれています。

GraphCanvas は、ScrollViewer を満たすために引き伸ばされます。ただし、一部の頂点は負の座標にあるため、RenderTransform が適用されており、すべてを単純に右にシフトします (TranslateTransform)。また、白い背景ブラシもあります。

左側の灰色の領域に注意してください。それはまだ GraphCanvas の一部ですが、背景ブラシはどういうわけかそこに拡張されていません。また、マウスで (ノードではなく灰色の領域で) 左クリックしても、イベントは発生しません。白い領域を左クリックすると、すべてのイベントが正常に取得されます。

4

2 に答える 2

0

各要素に「ドラッグ可能」動作をアタッチできます。

于 2010-03-10T15:02:02.817 に答える
0

canvas.mouseDownで CaptureMouse を呼び出し、マウスアップでReleaseMouseCaptureを呼び出します。また、キャンバスの背景を設定した場合transparentでも、ヒット テスト可能です。

于 2009-09-03T11:34:31.180 に答える