3

私はキャンバスオブジェクトを持っていて、その全体に素晴らしいコントロールを散りばめています。ScaleTransformオブジェクトを使用してキャンバスを拡大縮小し、ズームイン/ズームアウトできるようにしています。

コントロールをドラッグできるように配線しました。ドラッグアンドドロップは、MouseLeftButtonDown、MouseLeftButtonUp、およびMouseMoveを使用してうまく機能します。ここで、Canvasをクリックしただけでイベントを有効にする作業をしたいと思います。キャンバスオブジェクトのドキュメントを読むと、MouseLeftButtonDownイベントはUIElement上にある場合にのみ発生することがわかります。

マウスポインタがUIElement上にあるときに、マウスの左ボタンが押されたとき(または、スタイラスの先端がタブレットPCに触れたとき)に発生します。(UIElementから継承されます。)

残念ながら、私は反対の振る舞いをしたいです。マウスポンターがコントロール上にないときに、マウスがキャンバス上でクリックされたときを知りたいです。私はSilverlightを初めて使用するため、これを間違った方法で実行している可能性があります。見落としているものはありますか?私はこれを間違った方法で行っていますか?私は少しの助け、そしておそらく多くの方向性を探しています。

4

4 に答える 4

4

私は Silverlight の第一人者ではありませんが、他のすべての の下に透明UIElementを追加し、それを使用して、ユーザーが他のドラッグ/ドロップ可能な要素の外側をクリックしたかどうかを判断できますか?CanvasUIElement

于 2009-06-09T20:09:26.030 に答える
2

Canvasクリックが発生し、他のコントロールではなく、いつ発生したかを知りたいですか?

最も自然なことは、 をキャプチャすることCanvasですMouseLeftButtonDown。そのイベント内でピークを取り、クリックが発生した場所を確認します。次に、クリックの下の s でピークに達しUIElementます。物事をまっすぐに保つために、すべてを絶対座標に保つことをお勧めします。何かのようなもの:

void Page_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    Point p = e.GetPosition(null);
    var elements =  VisualTreeHelper.FindElementsInHostCoordinates(p, App.Current.RootVisual);
    foreach (var element in elements)
    {
        //Figure out if you're over a particular UI element
    }

}
于 2009-06-09T21:50:31.053 に答える
1

ドキュメントを間違って解釈している可能性があると思います。MSDN によると、Canvas 自体は次の実装ですUIElement

System.Windows.UIElement
  System.Windows.FrameworkElement
    System.Windows.Controls.Panel
      System.Windows.Controls.Canvas

私の経験から、間違っている場合は修正してください。通常、MouseLeftButtonDown は、クリックされた最上位の UIElement に対してのみ起動します。そのため、Canvas に MouseLeftButtonDown を実装する場合、ボタンがクリックされたときではなく、Canvas がクリックされたときにのみ起動する必要があります。まずは試してみるといいと思います。

于 2009-06-09T20:25:31.787 に答える
0

WPF では、これはルーティング イベントによって簡単に解決できると思います。ただし、Silverlight にはこの機能がありませんでした。チェックアウトすることをお勧めしVisualTreeHelper.FindElementsInHostCoordinatesます。この記事では、それについて少し説明します。

http://www.andybeaulieu.com/Default.aspx?tabid=67&EntryID=95

于 2009-06-09T22:25:38.330 に答える