/// <summary> /// Manually begins a window drag operation using the given drag handle. /// This is rather advanced and would normally happen automatically via a click event on the /// draghandle element. /// </summary> /// <param name="dragHandle"></param> /// <param name="offset">an optional offset value for the initial clickpoint position</param> internal void ForceWindowDragState(FrameworkElement dragHandle, Point offset) { Canvas.SetZIndex(ClickTargetLookup[dragHandle].DragElement, ZOrder++); CurrentCursor = Cursors.Arrow; CurrentTransformDelegate = TransformDrag; var win = (IWindow)ClickTargetLookup[dragHandle]; win.OnDragStarted(); OnWindowDragStart(win); RootPanel.Cursor = CurrentCursor; CurrentTransformDelegate = TransformDrag; CapturedElement = dragHandle; ClickPoint = dragHandle.GetPosition(RootPanel); ClickPoint = new Point(ClickPoint.X + offset.X < 0 ? 0 : ClickPoint.X + offset.X, ClickPoint.Y + offset.Y < 0 ? 0 : ClickPoint.Y + offset.Y); RootPanel.MouseLeftButtonUp += RootPanelMouseLeftButtonUp; RootPanel.MouseLeave += RootPanelMouseLeave; //wait for the rest of the layout to update before generating drop targets //HACK: this isn't very clean, but we need to be "sure" the layout has updated, and //there is no guarantee at this point that it hasn't updated already. Observable .Timer(_dropTargetDelay) .ObserveOnDispatcher() //prevent cross-thread issues .Subscribe(_ => GenerateDropTargets(ClickTargetLookup[dragHandle] as IDragDropSource)); }
private void ShowMenu(FrameworkElement menuParent, Menu menuToShow, bool hideOtherMenus) { if (hideOtherMenus) HideAllMenus(); var menuParentPosition = menuParent.GetPosition(Application.Current.RootVisual); var adjustedPosition = new Point(menuParentPosition.X - 1, menuParentPosition.Y - 2); var pGrid = LayoutContext != null ? LayoutContext.FindElement<Grid>() : MenuLayer; ChangeLayoutHitTest(false); pGrid.Children.Add(_cover); _cover.Click += CoverClick; MenuLayer.Children.Add(menuToShow); menuToShow.AbsoluteTransformPositionTo(adjustedPosition, Application.Current.RootVisual); _hoverShow = true; if (_isWindowBaseMenu) AddProxyMenuUI(menuToShow); }