فهرست منبع

Added Window.ShowActive for win32.

Steven Kirk 4 سال پیش
والد
کامیت
ea90f05f83

+ 2 - 2
src/Avalonia.Controls/Platform/IWindowBaseImpl.cs

@@ -5,9 +5,9 @@ namespace Avalonia.Platform
     public interface IWindowBaseImpl : ITopLevelImpl
     {
         /// <summary>
-        /// Shows the top level.
+        /// Shows the window.
         /// </summary>
-        void Show();
+        void Show(bool activate);
 
         /// <summary>
         /// Hides the window.

+ 17 - 3
src/Avalonia.Controls/Window.cs

@@ -129,6 +129,12 @@ namespace Avalonia.Controls
         public static readonly StyledProperty<SystemDecorations> SystemDecorationsProperty =
             AvaloniaProperty.Register<Window, SystemDecorations>(nameof(SystemDecorations), SystemDecorations.Full);
 
+        /// <summary>
+        /// Defines the <see cref="ShowActivated"/> property.
+        /// </summary>
+        public static readonly StyledProperty<bool> ShowActivatedProperty =
+            AvaloniaProperty.Register<Window, bool>(nameof(ShowActivated), true);
+
         /// <summary>
         /// Enables or disables the taskbar icon
         /// </summary>
@@ -352,13 +358,21 @@ namespace Avalonia.Controls
         /// <summary>
         /// Sets the system decorations (title bar, border, etc)
         /// </summary>
-        /// 
         public SystemDecorations SystemDecorations
         {
             get { return GetValue(SystemDecorationsProperty); }
             set { SetValue(SystemDecorationsProperty, value); }
         }
 
+        /// <summary>
+        /// Gets or sets a value that indicates whether a window is activated when first shown. 
+        /// </summary>
+        public bool ShowActivated
+        {
+            get { return GetValue(ShowActivatedProperty); }
+            set { SetValue(ShowActivatedProperty, value); }
+        }
+
         /// <summary>
         /// Enables or disables the taskbar icon
         /// </summary>
@@ -650,7 +664,7 @@ namespace Avalonia.Controls
                 Owner = parent;
                 parent?.AddChild(this, false);
 
-                PlatformImpl?.Show();
+                PlatformImpl?.Show(ShowActivated);
                 Renderer?.Start();
                 SetWindowStartupLocation(Owner?.PlatformImpl);
             }
@@ -720,7 +734,7 @@ namespace Avalonia.Controls
                 PlatformImpl?.SetParent(owner.PlatformImpl);
                 Owner = owner;
                 owner.AddChild(this, true);
-                PlatformImpl?.Show();
+                PlatformImpl?.Show(ShowActivated);
 
                 Renderer?.Start();
 

+ 1 - 1
src/Avalonia.Controls/WindowBase.cs

@@ -162,7 +162,7 @@ namespace Avalonia.Controls
                     LayoutManager.ExecuteInitialLayoutPass();
                     _hasExecutedInitialLayoutPass = true;
                 }
-                PlatformImpl?.Show();
+                PlatformImpl?.Show(true);
                 Renderer?.Start();
                 OnOpened(EventArgs.Empty);
             }

+ 1 - 1
src/Avalonia.DesignerSupport/Remote/PreviewerWindowImpl.cs

@@ -20,7 +20,7 @@ namespace Avalonia.DesignerSupport.Remote
             ClientSize = new Size(1, 1);
         }
 
-        public void Show()
+        public void Show(bool activate)
         {
         }
 

+ 1 - 1
src/Avalonia.DesignerSupport/Remote/Stubs.cs

@@ -77,7 +77,7 @@ namespace Avalonia.DesignerSupport.Remote
         {
         }
 
-        public void Show()
+        public void Show(bool activate)
         {
         }
 

+ 4 - 3
src/Avalonia.Headless/HeadlessWindowImpl.cs

@@ -75,9 +75,10 @@ namespace Avalonia.Headless
         public Action Closed { get; set; }
         public IMouseDevice MouseDevice { get; }
 
-        public void Show()
+        public void Show(bool activate)
         {
-            Dispatcher.UIThread.Post(() => Activated?.Invoke(), DispatcherPriority.Input);
+            if (activate)
+                Dispatcher.UIThread.Post(() => Activated?.Invoke(), DispatcherPriority.Input);
         }
 
         public void Hide()
@@ -148,7 +149,7 @@ namespace Avalonia.Headless
 
         public void ShowDialog(IWindowImpl parent)
         {
-            Show();
+            Show(true);
         }
 
         public void SetSystemDecorations(bool enabled)

+ 1 - 1
src/Avalonia.X11/X11Window.cs

@@ -815,7 +815,7 @@ namespace Avalonia.X11
                 XSetTransientForHint(_x11.Display, _handle, parent.Handle.Handle);
         }
 
-        public void Show()
+        public void Show(bool activate)
         {
             _wasMappedAtLeastOnce = true;
             XMapWindow(_x11.Display, _handle);

+ 2 - 1
src/Windows/Avalonia.Win32/PopupImpl.cs

@@ -17,8 +17,9 @@ namespace Avalonia.Win32
         [ThreadStatic]
         private static IntPtr s_parentHandle;
 
-        public override void Show()
+        public override void Show(bool activate)
         {
+            // Popups are always shown non-activated.
             UnmanagedMethods.ShowWindow(Handle.Handle, UnmanagedMethods.ShowWindowCommand.ShowNoActivate);
 
             // We need to steal focus if it's held by a child window of our toplevel window

+ 1 - 1
src/Windows/Avalonia.Win32/Win32Platform.cs

@@ -229,7 +229,7 @@ namespace Avalonia.Win32
         public IWindowImpl CreateEmbeddableWindow()
         {
             var embedded = new EmbeddedWindowImpl();
-            embedded.Show();
+            embedded.Show(true);
             return embedded;
         }
 

+ 8 - 6
src/Windows/Avalonia.Win32/WindowImpl.cs

@@ -240,7 +240,7 @@ namespace Avalonia.Win32
             {
                 if (IsWindowVisible(_hwnd))
                 {
-                    ShowWindow(value);
+                    ShowWindow(value, true);
                 }
                 else
                 {
@@ -550,10 +550,11 @@ namespace Avalonia.Win32
             UnmanagedMethods.ShowWindow(_hwnd, ShowWindowCommand.Hide);
         }
 
-        public virtual void Show()
+        public virtual void Show(bool activate)
         {
             SetWindowLongPtr(_hwnd, (int)WindowLongParam.GWL_HWNDPARENT, _parent != null ? _parent._hwnd : IntPtr.Zero);
-            ShowWindow(_showWindowState);
+
+            ShowWindow(_showWindowState, activate);
         }
 
         public Action GotInputWhenDisabled { get; set; }
@@ -891,7 +892,7 @@ namespace Avalonia.Win32
             ExtendClientAreaToDecorationsChanged?.Invoke(_isClientAreaExtended);
         }
 
-        private void ShowWindow(WindowState state)
+        private void ShowWindow(WindowState state, bool activate)
         {
             ShowWindowCommand? command;
 
@@ -901,7 +902,7 @@ namespace Avalonia.Win32
             {
                 case WindowState.Minimized:
                     newWindowProperties.IsFullScreen = false;
-                    command = ShowWindowCommand.Minimize;
+                    command = activate ? ShowWindowCommand.Minimize : ShowWindowCommand.ShowMinNoActive;
                     break;
                 case WindowState.Maximized:
                     newWindowProperties.IsFullScreen = false;
@@ -910,7 +911,8 @@ namespace Avalonia.Win32
 
                 case WindowState.Normal:
                     newWindowProperties.IsFullScreen = false;
-                    command = ShowWindowCommand.Restore;
+                    command = IsWindowVisible(_hwnd) ? ShowWindowCommand.Restore : 
+                        activate ? ShowWindowCommand.Normal : ShowWindowCommand.ShowNoActivate;
                     break;
 
                 case WindowState.FullScreen:

+ 8 - 8
tests/Avalonia.Controls.UnitTests/ContextMenuTests.cs

@@ -79,7 +79,7 @@ namespace Avalonia.Controls.UnitTests
         {
             using (Application())
             {
-                popupImpl.Setup(x => x.Show()).Verifiable();
+                popupImpl.Setup(x => x.Show(true)).Verifiable();
                 popupImpl.Setup(x => x.Hide()).Verifiable();
 
                 var sut = new ContextMenu();
@@ -99,7 +99,7 @@ namespace Avalonia.Controls.UnitTests
                 _mouse.Click(target);
 
                 Assert.False(sut.IsOpen);
-                popupImpl.Verify(x => x.Show(), Times.Once);
+                popupImpl.Verify(x => x.Show(true), Times.Once);
                 popupImpl.Verify(x => x.Hide(), Times.Once);
             }
         }
@@ -109,7 +109,7 @@ namespace Avalonia.Controls.UnitTests
         {
             using (Application())
             {
-                popupImpl.Setup(x => x.Show()).Verifiable();
+                popupImpl.Setup(x => x.Show(true)).Verifiable();
                 popupImpl.Setup(x => x.Hide()).Verifiable();
 
                 var sut = new ContextMenu();
@@ -130,7 +130,7 @@ namespace Avalonia.Controls.UnitTests
 
                 Assert.True(sut.IsOpen);
                 popupImpl.Verify(x => x.Hide(), Times.Once);
-                popupImpl.Verify(x => x.Show(), Times.Exactly(2));
+                popupImpl.Verify(x => x.Show(true), Times.Exactly(2));
             }
         }
         
@@ -177,7 +177,7 @@ namespace Avalonia.Controls.UnitTests
         {
             using (Application())
             {
-                popupImpl.Setup(x => x.Show()).Verifiable();
+                popupImpl.Setup(x => x.Show(true)).Verifiable();
 
                 bool eventCalled = false;
                 var sut = new ContextMenu();
@@ -193,7 +193,7 @@ namespace Avalonia.Controls.UnitTests
 
                 Assert.True(eventCalled);
                 Assert.False(sut.IsOpen);
-                popupImpl.Verify(x => x.Show(), Times.Never);
+                popupImpl.Verify(x => x.Show(true), Times.Never);
             }
         }
 
@@ -297,7 +297,7 @@ namespace Avalonia.Controls.UnitTests
         {
             using (Application())
             {
-                popupImpl.Setup(x => x.Show()).Verifiable();
+                popupImpl.Setup(x => x.Show(true)).Verifiable();
                 popupImpl.Setup(x => x.Hide()).Verifiable();
 
                 bool eventCalled = false;
@@ -321,7 +321,7 @@ namespace Avalonia.Controls.UnitTests
                 Assert.True(eventCalled);
                 Assert.True(sut.IsOpen);
 
-                popupImpl.Verify(x => x.Show(), Times.Once());
+                popupImpl.Verify(x => x.Show(true), Times.Once());
                 popupImpl.Verify(x => x.Hide(), Times.Never);
             }
         }

+ 1 - 1
tests/Avalonia.Controls.UnitTests/WindowBaseTests.cs

@@ -137,7 +137,7 @@ namespace Avalonia.Controls.UnitTests
                 var target = new TestWindowBase(windowImpl.Object);
                 target.IsVisible = true;
 
-                windowImpl.Verify(x => x.Show());
+                windowImpl.Verify(x => x.Show(true));
             }
         }
 

+ 1 - 1
tests/Avalonia.UnitTests/MockWindowingPlatform.cs

@@ -58,7 +58,7 @@ namespace Avalonia.UnitTests
                 windowImpl.Object.Resized?.Invoke(clientSize);
             });
 
-            windowImpl.Setup(x => x.Show()).Callback(() =>
+            windowImpl.Setup(x => x.Show(true)).Callback(() =>
             {
                 windowImpl.Object.Activated?.Invoke();
             });