Народ вообщем проблема в следующем : есть Canvas name = canvas1 на нем расположены два прямоугольника или два usercontrol , эти объекты можно передвигать по canvas1 с помощью мышки, мне нужно чтоб когда границы этих фигур соприкасались вываливался запрос на объединение фигур. Для поиска пересечения этих фигур в событии Canvas_MouseMove использую следующий код Код |
private void Canvas_MouseMove(object sender, MouseEventArgs e)
{
// if mouse is down when its moving, then it's dragging current
if (e.LeftButton == MouseButtonState.Pressed && current.InputElement != null)
this.current.IsDragging = true;
if (this.current.IsDragging && current.InputElement != null) {
// Retrieve the current position of the mouse.
var newX = Mouse.GetPosition((IInputElement)sender).X;
var newY = Mouse.GetPosition((IInputElement)sender).Y;
// Reset the location of the object (add to sender's renderTransform
// newPosition minus currentElement's position
var rt = ((UIElement)this.current.InputElement).RenderTransform;
var offsetX = rt.Value.OffsetX;
var offsetY = rt.Value.OffsetY;
rt.SetValue(TranslateTransform.XProperty, offsetX + newX - current.X);
rt.SetValue(TranslateTransform.YProperty, offsetY + newY - current.Y); this.current.X = newX;
this.current.Y = newY; if (ObjectIsCrossing(this.current.X, this.current.Y, (current.InputElement as ObjectRactangle).Width, (current.InputElement as ObjectRactangle).Height, rt)) { if (DoDrop) { if (MessageBox.Show("Выполнить объединение ?", "Внимание", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes) { } else DoDrop = false; } } else DoDrop = true;
// Update position of the mouse
}
}
|
Где метод ObjectIsCrossing это: Код |
//При перемещении объекта проверяем не попадают ли его координаты в диапазон координат другого обекта private bool ObjectIsCrossing(double x, double y, double i_width, double i_height, Transform tr) { m_lstHitList.Clear(); Rect rec = new Rect(x, y, i_width, i_height); RectangleGeometry rectangleArea = new RectangleGeometry(rec); ; VisualTreeHelper.HitTest(canvas1, null, HitTestCallback, new GeometryHitTestParameters(rectangleArea)); if (m_lstHitList.Count > 0) { return true; } else return false; }
public HitTestResultBehavior HitTestCallback(HitTestResult result) { DependencyObject obj = LogicalTreeHelper.GetParent(result.VisualHit); if (obj != null && obj.GetType() == typeof(ObjectRactangle) && (this.current.InputElement as ObjectRactangle) != obj ) { m_lstHitList.Add(obj as ObjectRactangle); return HitTestResultBehavior.Stop; } return HitTestResultBehavior.Continue; }
|
Однако это срабатывает за долго до пересечения, когда между фигурами большое расстояние. Не могу понять гдe я ошибся. И сразу второй вопрос на повестку дня, как в usercontrol вставить другой usercontrol? Добавлял в usercontrol steckpanel и потом в нее вставить , все равно фигня какая-то выходит, вставленный контрол в другой стороне от родительского
|