我创建了一个可拖动的控件,它想要限制它包含网格的边界(即不要让用户将它拖到网格之外)。
我需要一个返回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;
}
};
答案 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);
这看起来效果很好!