Silverlight hittest对象位于Grid边界内

时间:2012-10-04 10:39:24

标签: silverlight transform drag

我创建了一个可拖动的控件,它想要限制它包含网格的边界(即不要让用户将它拖到网格之外)。

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

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

e.g。一些代码(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;
            }

        };

2 个答案:

答案 0 :(得分:0)

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

但是,您可以采用一些快捷键,因为您知道Dialog以及拖动它的内容在拖动过程中不会改变形状或大小,并且{{1}的左侧边缘不可能} Dialog的右边缘右侧Grid的右边缘也位于Dialog的右侧。这仅适用于Grid未轮换的情况。

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

Dialog

答案 1 :(得分:0)

感谢。最后我采取了另一种方法;而不是试图阻止用户拖动容器边界之外的任何子控件,我只是阻止它们将指针拖到边界之外,例如,在mousemove事件处理程序中:

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

问题在于,在容器外部可以看到子控件的各个部分。

我所做的是设置父控件的Clip属性,以便隐藏边界之外的子节点。

e.g:

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

这看起来效果很好!