0

含まれているグリッドの境界に制限するドラッグ可能なコントロールを作成しました (つまり、ユーザーがグリッドの外にドラッグできないようにします)。

必要に応じてドラッグをキャンセルできるように、true または false を返すテストが必要です。

VisualTreeHelper.FindElementsInHostCoordinates や TransformToVisual などを見てきましたが、コントロールの各コーナーを何度もチェックしないと簡単な方法を見つけることができません。

たとえば、いくつかのコード (Dialog はドラッグされているコントロールの名前です):

MouseEventHandler mouseMove = (s, args) =>
        {
            var transform = new TranslateTransform();
            transform.X = args.GetPosition(Dialog).X - _mouseDownPosition.X;
            transform.Y = args.GetPosition(Dialog).Y - _mouseDownPosition.Y;

            if (transformGroup != null)
            {
                transformGroup.Children.Add(transform);
                Dialog.RenderTransform = transformGroup;
            }

        };
4

2 に答える 2

0

ありがとう。結局、私は別のアプローチを取りました。ユーザーが子コントロールのいずれかをコンテナーの境界の外にドラッグするのを止めようとする代わりに、私はユーザーがポインターを境界の外にドラッグするのを止めただけです。たとえば、mousemoveイベントハンドラーでは次のようになります。

if ((args.GetPosition(parentGrid).X < 0 || args.GetPosition(parentGrid).Y < 0))
{
    return; // don't do a translatetransform
}

これに伴う問題は、子コントロールの一部がコンテナの外側に表示されることでした。

親コントロールのClipプロパティを設定して、境界の外側の子の部分が非表示になるようにしました。

例えば:

var clipRegion = new RectangleGeometry();
clipRegion.Rect = new Rect(0, 0, elementParent.ActualWidth, elementParent.ActualHeight);
elementParent.SetValue(Canvas.ClipProperty, clipRegion);

これは非常にうまく機能しているようです!

于 2012-10-05T11:16:38.093 に答える
0

これは、コントロールの隅々までチェックするしかありません。

Dialogただし、ドラッグ中にドラッグしているものの形やサイズが変わらないこと、および の左端が の右端の右にあることは不可能であることをDialog知っているので、いくつかのショートカットを使用できます。Gridの右側にDialogもある の右端GridDialogこれは、が回転していない場合にのみ適用されます。

したがって、次の擬似コードのようなものが必要になります。

if (Dialog.Left >= Grid.Left &&
    Dialog.Top >= Grid.Top &&
    Dialog.Right <= Grid.Right &&
    Dialog.Bottom <= Grid.Bottom)
{
    // Allow the drag
}
else
{
    // Snap Dialog to the edge of Grid
}
于 2012-10-04T10:48:43.660 に答える