public static void Finish() { if (TargetContext == null) { return; //Already finished. } HidePointer(); TargetFrameworkPresenter.MouseMove -= Context_MouseMove; TargetFrameworkPresenter.MouseLeave -= Context_MouseLeave; TargetFrameworkPresenter.MouseEnter -= Context_MouseEnter; TargetFrameworkPresenter.Cursor = PreviousCursor; VisualPointer = null; TargetAdornerLayer = null; PreviousCursor = null; TargetContext = null; }
/// <summary> /// Starts a new pointing operation over the specified context control with the supplied decorator, /// plus indicating whether the decorator should be put closer of the specified cursor. /// </summary> public static void Start(IDocumentView Context, Drawing PointingDecorator, bool DecoratorCloser = false, Cursor PointingCursor = null) { if (TargetContext != null) { Finish(); } TargetContext = Context; // This works (but it should be determined the context container Window): Application.Current.MainWindow.Content as FrameworkElement; // this didn't work: TargetFrameworkPresenter = TargetContext.PresenterControl.GetNearestVisualDominantOfType<Window>(); TargetFrameworkPresenter = TargetContext.PresenterControl; PreviousCursor = TargetFrameworkPresenter.Cursor; TargetFrameworkPresenter.Cursor = PointingCursor ?? Cursors.Arrow; TargetAdornerLayer = TargetContext.PresenterLayer; VisualPointer = new PointerAdorner(TargetContext, TargetFrameworkPresenter, PointingDecorator, DecoratorCloser); TargetFrameworkPresenter.MouseEnter += Context_MouseEnter; TargetFrameworkPresenter.MouseLeave += Context_MouseLeave; TargetFrameworkPresenter.MouseMove += Context_MouseMove; ShowPointer(); }