【发布时间】:2016-06-30 20:38:56
【问题描述】:
我有一个在网格内拖动的用户控件。 Z-Index 设置得相当高,这样我就可以将它保持在其他孩子之上。拖动控件效果很好,但是如果用户想要将控件移到网格之外,它会允许这样做。
如何防止它离开父 Grid 控件的边界,这就是我现在所拥有的:
private System.Windows.Point _anchorPoint;
private System.Windows.Point _currentPoint;
private bool _isInDrag;
private void UserControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var element = sender as FrameworkElement;
_anchorPoint = e.GetPosition(null);
if (element != null) element.CaptureMouse();
_isInDrag = true;
e.Handled = true;
}
private void UserControl_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (!_isInDrag) return;
var element = sender as FrameworkElement;
if (element != null) element.ReleaseMouseCapture();
_isInDrag = false;
e.Handled = true;
}
private void UserControl_MouseMove(object sender, MouseEventArgs e)
{
if (!_isInDrag) return;
_currentPoint = e.GetPosition(null);
UIElement container = VisualTreeHelper.GetParent(_parentGrid) as UIElement;
System.Windows.Point relativeLocation = _parentGrid.TranslatePoint(new System.Windows.Point(0, 0), container);
if (_currentPoint.X > relativeLocation.X) return;
if(_currentPoint.Y >= relativeLocation.Y)return;
_transform.X += _currentPoint.X - _anchorPoint.X;
_transform.Y += (_currentPoint.Y - _anchorPoint.Y);
RenderTransform = _transform;
_anchorPoint = _currentPoint;
}
“relativeLocation”总是 0x0,所以这不起作用。任何想法将不胜感激。
*注意:我知道如果我将 UserControl 更改为 Window,它会缓解我遇到的所有问题。但老实说,这样看起来很棒,我真的不想把窗户弄得乱七八糟。该系统作为仪表板打开,使用用户的整个窗口(在单独的窗口中打开)。所以当你在这里打开一个窗口时,它不会正确流动。
【问题讨论】:
-
看起来您正在计算
parentGrid与其容器的相对位置。这可以解释零点。尝试使用UserControl代替它的容器,参考this post。