diff --git a/native/Avalonia.Native/src/OSX/window.mm b/native/Avalonia.Native/src/OSX/window.mm index 2c1208a38d..0f2138d32a 100644 --- a/native/Avalonia.Native/src/OSX/window.mm +++ b/native/Avalonia.Native/src/OSX/window.mm @@ -31,9 +31,11 @@ public: AvnPoint lastPositionSet; NSString* _lastTitle; IAvnAppMenu* _mainMenu; + bool _shown; WindowBaseImpl(IAvnWindowBaseEvents* events, IAvnGlContext* gl) { + _shown = false; _mainMenu = nullptr; BaseEvents = events; _glContext = gl; @@ -115,6 +117,8 @@ public: [NSApp activateIgnoringOtherApps:YES]; [Window setTitle:_lastTitle]; + + _shown = true; return S_OK; } @@ -400,6 +404,7 @@ protected: [Window setStyleMask:GetStyle()]; } +public: virtual void OnResized () { @@ -615,57 +620,63 @@ private: { _lastWindowState = state; - switch (state) { - case Maximized: - lastPositionSet.X = 0; - lastPositionSet.Y = 0; - - if([Window isMiniaturized]) - { - [Window deminiaturize:Window]; - } - - if(!IsZoomed()) - { - DoZoom(); - } - break; - - case Minimized: - [Window miniaturize:Window]; - break; - - default: - if([Window isMiniaturized]) - { - [Window deminiaturize:Window]; - } - - if(IsZoomed()) - { - DoZoom(); - } - break; + if(_shown) + { + switch (state) { + case Maximized: + lastPositionSet.X = 0; + lastPositionSet.Y = 0; + + if([Window isMiniaturized]) + { + [Window deminiaturize:Window]; + } + + if(!IsZoomed()) + { + DoZoom(); + } + break; + + case Minimized: + [Window miniaturize:Window]; + break; + + default: + if([Window isMiniaturized]) + { + [Window deminiaturize:Window]; + } + + if(IsZoomed()) + { + DoZoom(); + } + break; + } } return S_OK; } } - -protected: + virtual void OnResized () override { - auto windowState = [Window isMiniaturized] ? Minimized - : (IsZoomed() ? Maximized : Normal); - - if (windowState != _lastWindowState) + if(_shown) { - _lastWindowState = windowState; + auto windowState = [Window isMiniaturized] ? Minimized + : (IsZoomed() ? Maximized : Normal); - WindowEvents->WindowStateChanged(windowState); + if (windowState != _lastWindowState) + { + _lastWindowState = windowState; + + WindowEvents->WindowStateChanged(windowState); + } } } +protected: virtual NSWindowStyleMask GetStyle() override { unsigned long s = NSWindowStyleMaskBorderless; @@ -1360,6 +1371,11 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent } } +- (void)windowDidResize:(NSNotification *)notification +{ + _parent->OnResized(); +} + - (BOOL)windowShouldZoom:(NSWindow *)window toFrame:(NSRect)newFrame { return true; @@ -1430,6 +1446,7 @@ protected: [Window setContentSize:NSSize{x, y}]; [Window setFrameTopLeftPoint:ToNSPoint(ConvertPointY(lastPositionSet))]; + return S_OK; } } diff --git a/src/Avalonia.Controls/Primitives/ScrollBar.cs b/src/Avalonia.Controls/Primitives/ScrollBar.cs index 4d3ae3c5b8..161c7121c5 100644 --- a/src/Avalonia.Controls/Primitives/ScrollBar.cs +++ b/src/Avalonia.Controls/Primitives/ScrollBar.cs @@ -2,8 +2,6 @@ // Licensed under the MIT license. See licence.md file in the project root for full license information. using System; -using System.Reactive; -using System.Reactive.Linq; using Avalonia.Data; using Avalonia.Interactivity; using Avalonia.Input; @@ -64,13 +62,6 @@ namespace Avalonia.Controls.Primitives /// public ScrollBar() { - var isVisible = Observable.Merge( - this.GetObservable(MinimumProperty).Select(_ => Unit.Default), - this.GetObservable(MaximumProperty).Select(_ => Unit.Default), - this.GetObservable(ViewportSizeProperty).Select(_ => Unit.Default), - this.GetObservable(VisibilityProperty).Select(_ => Unit.Default)) - .Select(_ => CalculateIsVisible()); - this.Bind(IsVisibleProperty, isVisible, BindingPriority.Style); UpdatePseudoClasses(Orientation); } @@ -105,26 +96,20 @@ namespace Avalonia.Controls.Primitives public event EventHandler Scroll; /// - /// Calculates whether the scrollbar should be visible. + /// Calculates and updates whether the scrollbar should be visible. /// - /// The scrollbar's visibility. - private bool CalculateIsVisible() + private void UpdateIsVisible() { - switch (Visibility) + var isVisible = Visibility switch { - case ScrollBarVisibility.Visible: - return true; - - case ScrollBarVisibility.Disabled: - case ScrollBarVisibility.Hidden: - return false; - - case ScrollBarVisibility.Auto: - return double.IsNaN(ViewportSize) || Maximum > 0; - - default: - throw new InvalidOperationException("Invalid value for ScrollBar.Visibility."); - } + ScrollBarVisibility.Visible => true, + ScrollBarVisibility.Disabled => false, + ScrollBarVisibility.Hidden => false, + ScrollBarVisibility.Auto => (double.IsNaN(ViewportSize) || Maximum > 0), + _ => throw new InvalidOperationException("Invalid value for ScrollBar.Visibility.") + }; + + SetValue(IsVisibleProperty, isVisible, BindingPriority.Style); } protected override void OnKeyDown(KeyEventArgs e) @@ -153,6 +138,16 @@ namespace Avalonia.Controls.Primitives { UpdatePseudoClasses(newValue.GetValueOrDefault()); } + else + { + if (property == MinimumProperty || + property == MaximumProperty || + property == ViewportSizeProperty || + property == VisibilityProperty) + { + UpdateIsVisible(); + } + } } protected override void OnTemplateApplied(TemplateAppliedEventArgs e) diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index 4acfb75cb9..52b6a3c041 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -701,7 +701,8 @@ namespace Avalonia.Controls { var text = Text; - if (text != null && e.GetCurrentPoint(this).Properties.IsLeftButtonPressed) + var clickInfo = e.GetCurrentPoint(this); + if (text != null && clickInfo.Properties.IsLeftButtonPressed && !(clickInfo.Pointer?.Captured is Border)) { var point = e.GetPosition(_presenter); var index = CaretIndex = _presenter.GetCaretIndex(point); diff --git a/src/Avalonia.Themes.Default/TextBox.xaml b/src/Avalonia.Themes.Default/TextBox.xaml index 2c4cafde26..4fb3653e89 100644 --- a/src/Avalonia.Themes.Default/TextBox.xaml +++ b/src/Avalonia.Themes.Default/TextBox.xaml @@ -69,7 +69,7 @@ -