// Проверка на пересечение с другими элементами в Canvas public static bool IsIntersectOnCanvas(UIElement element) { var currentPos = CustomVisualTreeHelper.PositionElementOnKernelCanvas(element); var uIElement = CustomVisualTreeHelper.KernelCanvas.Children. Where(e => { return((e is IEComponent) && (!e.Equals(element))); }). FirstOrDefault(e => { var currentPos_e = CustomVisualTreeHelper.PositionElementOnKernelCanvas(e); return( // Находится ли левый верхний угол элемента (element) в области элемента (e) (currentPos.X >= currentPos_e.X) && (currentPos.X <= (currentPos_e.X + e.DesiredSize.Width)) && (currentPos.Y >= currentPos_e.Y) && (currentPos.Y <= (currentPos_e.Y + e.DesiredSize.Height)) || // * // Находится ли нижний правый угол элемента (element) в области элемента (e) (currentPos.X + element.DesiredSize.Width >= currentPos_e.X) && (currentPos.X + element.DesiredSize.Width <= (currentPos_e.X + e.DesiredSize.Width)) && (currentPos.Y + element.DesiredSize.Height >= currentPos_e.Y) && (currentPos.Y + element.DesiredSize.Height <= (currentPos_e.Y + e.DesiredSize.Height)) || // * (currentPos.X + element.DesiredSize.Width >= currentPos_e.X) && (currentPos.X <= (currentPos_e.X + e.DesiredSize.Width)) && (currentPos.Y + element.DesiredSize.Height >= currentPos_e.Y) && (currentPos.Y <= (currentPos_e.Y + e.DesiredSize.Height)) ); }); return(uIElement == null ? false : true); }
private static Point GetCenterComponentOnCanvas(UIElement element) { var CurrentPositionComponentOnCanvas = CustomVisualTreeHelper.PositionElementOnKernelCanvas(element); return(new Point( (element as IEComponent).CenterComponent.X + CurrentPositionComponentOnCanvas.X, (element as IEComponent).CenterComponent.Y + CurrentPositionComponentOnCanvas.Y )); }
public static void UserControl_ManipulationCompleted(this IEComponent component, object sender, ManipulationCompletedRoutedEventArgs e) { var currentPositionComponentOnCanvas = CustomVisualTreeHelper.PositionElementOnKernelCanvas(sender as UIElement); var left = Math.Round(currentPositionComponentOnCanvas.X); // Убрать Round? var top = Math.Round(currentPositionComponentOnCanvas.Y); // Выравнивание элемента по центру var centerComponentOnCanvas = GetCenterComponentOnCanvas(sender as UIElement); var step = 20; var deltaX = Math.Round(centerComponentOnCanvas.X) % step; if (deltaX < step / 2) { left -= deltaX; } else { left += (step - deltaX); } var deltaY = Math.Round(centerComponentOnCanvas.Y) % step; if (deltaY < step / 2) { top -= deltaY; } else { top += (step - deltaY); } // * // Проверка на выход из границ Canvas left = left < 0 ? 0 : left; top = top < 0 ? 0 : top; // * Canvas.SetLeft((UIElement)sender, left); Canvas.SetTop((UIElement)sender, top); if (IsIntersectOnCanvas(sender as UIElement)) { Canvas.SetLeft((UIElement)sender, (sender as IEComponent).OldPositionComponentOnCanvas.X); Canvas.SetTop((UIElement)sender, (sender as IEComponent).OldPositionComponentOnCanvas.Y); } (sender as IEComponent).ChildrenPositionUpdate(); }
public static void UserControl_ManipulationStarted(this IEComponent component, object sender, ManipulationStartedRoutedEventArgs e) { (sender as IEComponent).OldPositionComponentOnCanvas = CustomVisualTreeHelper.PositionElementOnKernelCanvas(sender as UIElement); }