private void TouchUp(object sender, TouchEventArgs e) { if (!Game.Input.IsMouseButtonReleased(MouseButton.Left)) { return; } isInProgress = false; Controller.ChangeCursor(null); e.Handled = true; // dragging state if (isDragging) { isDragging = false; if (dragAdorner != null) { // Create a collection with all properties that might have changed var changes = new Dictionary <string, object> { { nameof(UIElement.Margin), dragAdorner.GameSideElement.Margin }, { nameof(UIElement.Width), dragAdorner.GameSideElement.Width }, { nameof(UIElement.HorizontalAlignment), dragAdorner.GameSideElement.HorizontalAlignment }, { nameof(UIElement.Height), dragAdorner.GameSideElement.Height }, { nameof(UIElement.VerticalAlignment), dragAdorner.GameSideElement.VerticalAlignment }, //{ nameof(UIElement.Depth), dragAdorner.GameSideElement.Depth }, //{ nameof(UIElement.DepthAlignment), dragAdorner.GameSideElement.DepthAlignment }, }; // Propagate the changes to the asset ApplyChanges(dragAdorner.GameSideElement.Id, changes); dragAdorner.OnResizingCompleted(); } dragAdorner = null; return; } // other states var editor = Controller.Editor; var worldPosition = e.WorldPosition; // Get the id of the game-side element that is under the pointer position Guid elementId; if (!TryGetElementIdAtPosition(ref worldPosition, out elementId)) { // Nothing, clear the selection editor.Dispatcher.InvokeAsync(() => editor.ClearSelection()); return; } // Select the corresponding asset-side UIElement, if pointer did not move between down and up events var delta = (e.ScreenPosition - originScreenPosition) * new Vector2(Game.GraphicsDevice.Presenter.BackBuffer.Width, Game.GraphicsDevice.Presenter.BackBuffer.Height); if (Math.Abs(delta.X) < System.Windows.SystemParameters.MinimumHorizontalDragDistance && Math.Abs(delta.Y) < System.Windows.SystemParameters.MinimumVerticalDragDistance) { var additiveSelection = Game.Input.IsKeyDown(Keys.LeftCtrl) || Game.Input.IsKeyDown(Keys.RightCtrl); editor.Dispatcher.InvokeAsync(() => editor.Select(elementId, additiveSelection)).Forget(); } }
private void PreviewTouchDown(object sender, TouchEventArgs e) { if (!Game.Input.IsMouseButtonDown(MouseButton.Left)) { return; } // Save the current pointer position originWorldPosition = currentPosition = e.WorldPosition; originScreenPosition = e.ScreenPosition; // No prior selection (selection is done on TouchUp) if (selectedAdorners.Count == 0) { return; } // Get the resizing adorners that are under the pointer position var resizingAdorners = ( from hit in GetAdornerVisualsAtPosition(ref originWorldPosition) // only on currently selected elements (retrieve associated game-side element id from hit visual) join s in selectedAdorners on hit.Element.DependencyProperties.Get(AssociatedElementIdPropertyKey) equals s // order by closest to screen (z goes negatively) orderby hit.IntersectionPoint.Z // retrieve resizing adorners (MoveAdorner or SizingAdorner), if any let r = GetAssociatedAdorner(hit.Element) as IResizingAdorner where r != null select r).ToList(); if (resizingAdorners.Count == 0) { return; } if (resizingAdorners.Count == 1 && selectedAdorners.Count == 1) { // If ALT is pressed, we are starting a drag/drop to the outside of the UI editor if (Game.Input.IsKeyDown(Keys.LeftAlt) || Game.Input.IsKeyDown(Keys.RightAlt)) { e.Handled = true; Controller.DoDragDrop(resizingAdorners[0].GameSideElement.Id); return; } } // start drag dragAdorner = resizingAdorners[0]; // hit results have been order by Z already isInProgress = true; }