0

我创建了一个可拖动控件,它希望限制在其包含网格的边界内(即不允许用户将其拖动到网格之外)。

我需要一个返回 true 或 false 的测试,以便我可以在必要时取消拖动。

我查看了 VisualTreeHelper.FindElementsInHostCoordinates 和 TransformToVisual 等,但如果不对控件的每个角进行大量检查,我就找不到一种简单的方法。

例如一些代码(对话框是被拖动控件的名称):

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

除了检查控件的每个角落之外,别无他法。

但是,您可以采取一些捷径,因为您知道,Dialog并且拖动它的内容在拖动过程中不会改变形状或大小,并且左手边缘不可能在没有右手边缘的Dialog右侧Grid的右手边Dialog也在右边Grid。这仅适用于Dialog不旋转的情况。

所以,你需要类似下面的伪代码:

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 回答
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 回答