/// <summary> /// Initializes a new instance of the <see cref="TopLevel"/> class. /// </summary> /// <param name="impl">The platform-specific window implementation.</param> /// <param name="dependencyResolver"> /// The dependency resolver to use. If null the default dependency resolver will be used. /// </param> public TopLevel(ITopLevelImpl impl, IAvaloniaDependencyResolver dependencyResolver) { if (impl == null) { throw new InvalidOperationException( "Could not create window implementation: maybe no windowing subsystem was initialized?"); } PlatformImpl = impl; dependencyResolver = dependencyResolver ?? AvaloniaLocator.Current; var styler = TryGetService <IStyler>(dependencyResolver); _accessKeyHandler = TryGetService <IAccessKeyHandler>(dependencyResolver); _inputManager = TryGetService <IInputManager>(dependencyResolver); _keyboardNavigationHandler = TryGetService <IKeyboardNavigationHandler>(dependencyResolver); _renderInterface = TryGetService <IPlatformRenderInterface>(dependencyResolver); _globalStyles = TryGetService <IGlobalStyles>(dependencyResolver); Renderer = impl.CreateRenderer(this); if (Renderer != null) { Renderer.SceneInvalidated += SceneInvalidated; } impl.SetInputRoot(this); impl.Closed = HandleClosed; impl.Input = HandleInput; impl.Paint = HandlePaint; impl.Resized = HandleResized; impl.ScalingChanged = HandleScalingChanged; _keyboardNavigationHandler?.SetOwner(this); _accessKeyHandler?.SetOwner(this); if (_globalStyles is object) { _globalStyles.GlobalStylesAdded += ((IStyleHost)this).StylesAdded; _globalStyles.GlobalStylesRemoved += ((IStyleHost)this).StylesRemoved; } styler?.ApplyStyles(this); ClientSize = impl.ClientSize; this.GetObservable(PointerOverElementProperty) .Select( x => (x as InputElement)?.GetObservable(CursorProperty) ?? Observable.Empty <Cursor>()) .Switch().Subscribe(cursor => PlatformImpl?.SetCursor(cursor?.PlatformCursor)); if (((IStyleHost)this).StylingParent is IResourceProvider applicationResources) { WeakSubscriptionManager.Subscribe( applicationResources, nameof(IResourceProvider.ResourcesChanged), this); } }
/// <summary> /// Initializes a new instance of the <see cref="TopLevel"/> class. /// </summary> /// <param name="impl">The platform-specific window implementation.</param> /// <param name="dependencyResolver"> /// The dependency resolver to use. If null the default dependency resolver will be used. /// </param> public TopLevel(ITopLevelImpl impl, IPerspexDependencyResolver dependencyResolver) { if (impl == null) { throw new InvalidOperationException( "Could not create window implementation: maybe no windowing subsystem was initialized?"); } PlatformImpl = impl; dependencyResolver = dependencyResolver ?? PerspexLocator.Current; var renderInterface = TryGetService <IPlatformRenderInterface>(dependencyResolver); var styler = TryGetService <IStyler>(dependencyResolver); _accessKeyHandler = TryGetService <IAccessKeyHandler>(dependencyResolver); _inputManager = TryGetService <IInputManager>(dependencyResolver); _keyboardNavigationHandler = TryGetService <IKeyboardNavigationHandler>(dependencyResolver); LayoutManager = TryGetService <ILayoutManager>(dependencyResolver); _renderQueueManager = TryGetService <IRenderQueueManager>(dependencyResolver); (TryGetService <ITopLevelRenderer>(dependencyResolver) ?? new DefaultTopLevelRenderer()).Attach(this); PlatformImpl.SetInputRoot(this); PlatformImpl.Activated = HandleActivated; PlatformImpl.Deactivated = HandleDeactivated; PlatformImpl.Closed = HandleClosed; PlatformImpl.Input = HandleInput; PlatformImpl.Resized = HandleResized; Size clientSize = ClientSize = PlatformImpl.ClientSize; if (LayoutManager != null) { LayoutManager.Root = this; LayoutManager.LayoutNeeded.Subscribe(_ => HandleLayoutNeeded()); LayoutManager.LayoutCompleted.Subscribe(_ => HandleLayoutCompleted()); } if (_keyboardNavigationHandler != null) { _keyboardNavigationHandler.SetOwner(this); } if (_accessKeyHandler != null) { _accessKeyHandler.SetOwner(this); } styler?.ApplyStyles(this); GetObservable(ClientSizeProperty).Skip(1).Subscribe(x => PlatformImpl.ClientSize = x); GetObservable(PointerOverElementProperty) .Select( x => (x as InputElement)?.GetObservable(CursorProperty) ?? Observable.Empty <Cursor>()) .Switch().Subscribe(cursor => PlatformImpl.SetCursor(cursor?.PlatformCursor)); }
/// <summary> /// Initializes a new instance of the <see cref="TopLevel"/> class. /// </summary> /// <param name="impl">The platform-specific window implementation.</param> /// <param name="dependencyResolver"> /// The dependency resolver to use. If null the default dependency resolver will be used. /// </param> public TopLevel(ITopLevelImpl impl, IAvaloniaDependencyResolver dependencyResolver) { if (impl == null) { throw new InvalidOperationException( "Could not create window implementation: maybe no windowing subsystem was initialized?"); } PlatformImpl = impl; dependencyResolver = dependencyResolver ?? AvaloniaLocator.Current; var styler = TryGetService <IStyler>(dependencyResolver); _accessKeyHandler = TryGetService <IAccessKeyHandler>(dependencyResolver); _inputManager = TryGetService <IInputManager>(dependencyResolver); _keyboardNavigationHandler = TryGetService <IKeyboardNavigationHandler>(dependencyResolver); _applicationLifecycle = TryGetService <IApplicationLifecycle>(dependencyResolver); _renderInterface = TryGetService <IPlatformRenderInterface>(dependencyResolver); var renderLoop = TryGetService <IRenderLoop>(dependencyResolver); var rendererFactory = TryGetService <IRendererFactory>(dependencyResolver); Renderer = rendererFactory?.CreateRenderer(this, renderLoop); PlatformImpl.SetInputRoot(this); PlatformImpl.Activated = HandleActivated; PlatformImpl.Deactivated = HandleDeactivated; PlatformImpl.Closed = HandleClosed; PlatformImpl.Input = HandleInput; PlatformImpl.Paint = Renderer != null ? (Action <Rect>)Renderer.Render : null; PlatformImpl.Resized = HandleResized; PlatformImpl.ScalingChanged = HandleScalingChanged; PlatformImpl.PositionChanged = HandlePositionChanged; _keyboardNavigationHandler?.SetOwner(this); _accessKeyHandler?.SetOwner(this); styler?.ApplyStyles(this); ClientSize = PlatformImpl.ClientSize; this.GetObservable(ClientSizeProperty).Skip(1).Subscribe(x => PlatformImpl.ClientSize = x); this.GetObservable(PointerOverElementProperty) .Select( x => (x as InputElement)?.GetObservable(CursorProperty) ?? Observable.Empty <Cursor>()) .Switch().Subscribe(cursor => PlatformImpl.SetCursor(cursor?.PlatformCursor)); if (_applicationLifecycle != null) { _applicationLifecycle.OnExit += OnApplicationExiting; } }
public void SetCursor(IPlatformHandle cursor) => _tl.SetCursor(cursor);
/// <summary> /// Initializes a new instance of the <see cref="TopLevel"/> class. /// </summary> /// <param name="impl">The platform-specific window implementation.</param> /// <param name="dependencyResolver"> /// The dependency resolver to use. If null the default dependency resolver will be used. /// </param> public TopLevel(ITopLevelImpl impl, IAvaloniaDependencyResolver?dependencyResolver) { if (impl == null) { throw new InvalidOperationException( "Could not create window implementation: maybe no windowing subsystem was initialized?"); } PlatformImpl = impl; _actualTransparencyLevel = PlatformImpl.TransparencyLevel; dependencyResolver = dependencyResolver ?? AvaloniaLocator.Current; var styler = TryGetService <IStyler>(dependencyResolver); _accessKeyHandler = TryGetService <IAccessKeyHandler>(dependencyResolver); _inputManager = TryGetService <IInputManager>(dependencyResolver); _keyboardNavigationHandler = TryGetService <IKeyboardNavigationHandler>(dependencyResolver); _renderInterface = TryGetService <IPlatformRenderInterface>(dependencyResolver); _globalStyles = TryGetService <IGlobalStyles>(dependencyResolver); Renderer = impl.CreateRenderer(this); if (Renderer != null) { Renderer.SceneInvalidated += SceneInvalidated; } else { // Prevent nullable error. Renderer = null !; } impl.SetInputRoot(this); impl.Closed = HandleClosed; impl.Input = HandleInput; impl.Paint = HandlePaint; impl.Resized = HandleResized; impl.ScalingChanged = HandleScalingChanged; impl.TransparencyLevelChanged = HandleTransparencyLevelChanged; _keyboardNavigationHandler?.SetOwner(this); _accessKeyHandler?.SetOwner(this); if (_globalStyles is object) { _globalStyles.GlobalStylesAdded += ((IStyleHost)this).StylesAdded; _globalStyles.GlobalStylesRemoved += ((IStyleHost)this).StylesRemoved; } styler?.ApplyStyles(this); ClientSize = impl.ClientSize; FrameSize = impl.FrameSize; this.GetObservable(PointerOverElementProperty) .Select( x => (x as InputElement)?.GetObservable(CursorProperty) ?? Observable.Empty <Cursor>()) .Switch().Subscribe(cursor => PlatformImpl?.SetCursor(cursor?.PlatformImpl)); if (((IStyleHost)this).StylingParent is IResourceHost applicationResources) { _resourcesChangesSubscriber = new TargetWeakEventSubscriber <TopLevel, ResourcesChangedEventArgs>( this, static (target, _, _, e) => { ((ILogical)target).NotifyResourcesChanged(e); }); ResourcesChangedWeakEvent.Subscribe(applicationResources, _resourcesChangesSubscriber); } impl.LostFocus += PlatformImpl_LostFocus; _pointerOverPreProcessor = new PointerOverPreProcessor(this); _pointerOverPreProcessorSubscription = _inputManager?.PreProcess.Subscribe(_pointerOverPreProcessor); }