From 2a7d2cedc362e0b5ff50696f124f65e7b4b23054 Mon Sep 17 00:00:00 2001 From: sdoroff Date: Tue, 8 May 2018 17:26:02 -0400 Subject: [PATCH 1/5] Fixes #1554 The issue was caused by the lack of a proper TextChanged event on the TextBox I implemented a work around --- src/Avalonia.Controls/AutoCompleteBox.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Avalonia.Controls/AutoCompleteBox.cs b/src/Avalonia.Controls/AutoCompleteBox.cs index 8e801d606b..351cbf5520 100644 --- a/src/Avalonia.Controls/AutoCompleteBox.cs +++ b/src/Avalonia.Controls/AutoCompleteBox.cs @@ -1954,6 +1954,10 @@ namespace Avalonia.Controls // 1. Minimum prefix length // 2. If a delay timer is in use, use it bool populateReady = newText.Length >= MinimumPrefixLength && MinimumPrefixLength >= 0; + if(populateReady && MinimumPrefixLength == 0 && String.IsNullOrEmpty(newText) && String.IsNullOrEmpty(SearchText)) + { + populateReady = false; + } _userCalledPopulate = populateReady ? userInitiated : false; // Update the interface and values only as necessary From a3e02e3068e672aee79ceb75aa8d21d6d2e08d92 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 9 May 2018 22:57:26 +0100 Subject: [PATCH 2/5] restore correct implementation of SetSystemDecorations on Win32. --- src/Windows/Avalonia.Win32/WindowImpl.cs | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index cf6cb40e58..8637f30970 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -245,19 +245,13 @@ namespace Avalonia.Win32 return; } - var style = (UnmanagedMethods.WindowStyles)UnmanagedMethods.GetWindowLong(_hwnd, (int)UnmanagedMethods.WindowLongParam.GWL_STYLE); - - var systemDecorationStyles = UnmanagedMethods.WindowStyles.WS_OVERLAPPED - | UnmanagedMethods.WindowStyles.WS_CAPTION - | UnmanagedMethods.WindowStyles.WS_SYSMENU - | UnmanagedMethods.WindowStyles.WS_MINIMIZEBOX - | UnmanagedMethods.WindowStyles.WS_MAXIMIZEBOX; + var style = (UnmanagedMethods.WindowStyles)UnmanagedMethods.GetWindowLong(_hwnd, (int)UnmanagedMethods.WindowLongParam.GWL_STYLE); - style |= systemDecorationStyles; + style |= UnmanagedMethods.WindowStyles.WS_OVERLAPPEDWINDOW; if (!value) { - style ^= systemDecorationStyles; + style ^= UnmanagedMethods.WindowStyles.WS_OVERLAPPEDWINDOW; } UnmanagedMethods.RECT windowRect; From 865a866388194ff08dcec1a131aca3ac3353eff1 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 10 May 2018 13:23:49 +0100 Subject: [PATCH 3/5] update documentation and fix bug when system decorations are restored so that CanResize is obeyed. --- src/Avalonia.Controls/Window.cs | 4 ++- src/Windows/Avalonia.Win32/WindowImpl.cs | 35 ++++++++++++++++++------ 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/Avalonia.Controls/Window.cs b/src/Avalonia.Controls/Window.cs index 16ee3a46b3..91d6c874d3 100644 --- a/src/Avalonia.Controls/Window.cs +++ b/src/Avalonia.Controls/Window.cs @@ -214,7 +214,9 @@ namespace Avalonia.Controls } /// - /// Enables or disables resizing of the window + /// Enables or disables resizing of the window. + /// Note that if is set to False then this property + /// has no effect and should be treated as a recommendation for the user setting HasSystemDecorations. /// public bool CanResize { diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index 8637f30970..be28b64c5a 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -287,6 +287,21 @@ namespace Avalonia.Win32 UnmanagedMethods.SetWindowPosFlags.SWP_NOZORDER | UnmanagedMethods.SetWindowPosFlags.SWP_NOACTIVATE); _decorated = value; + + if(_decorated) + { + if (_resizable) + { + // If we switch decorations back on we need to restore WS_SizeFrame. + _resizable = false; + CanResize(true); + } + else + { + _resizable = true; + CanResize(false); + } + } } public void Invalidate(Rect rect) @@ -857,14 +872,18 @@ namespace Avalonia.Win32 return; } - var style = (UnmanagedMethods.WindowStyles)UnmanagedMethods.GetWindowLong(_hwnd, (int)UnmanagedMethods.WindowLongParam.GWL_STYLE); - - if (value) - style |= UnmanagedMethods.WindowStyles.WS_SIZEFRAME; - else - style &= ~(UnmanagedMethods.WindowStyles.WS_SIZEFRAME); - - UnmanagedMethods.SetWindowLong(_hwnd, (int)UnmanagedMethods.WindowLongParam.GWL_STYLE, (uint)style); + if (_decorated) + { + var style = (UnmanagedMethods.WindowStyles)UnmanagedMethods.GetWindowLong(_hwnd, (int)UnmanagedMethods.WindowLongParam.GWL_STYLE); + + if (value) + style |= UnmanagedMethods.WindowStyles.WS_SIZEFRAME; + else + style &= ~(UnmanagedMethods.WindowStyles.WS_SIZEFRAME); + + UnmanagedMethods.SetWindowLong(_hwnd, (int)UnmanagedMethods.WindowLongParam.GWL_STYLE, (uint)style); + } + _resizable = value; } } From 400dc55071ff2a5ae23f116c07380f3fedb0a843 Mon Sep 17 00:00:00 2001 From: zii-dmg Date: Fri, 11 May 2018 18:28:39 +0300 Subject: [PATCH 4/5] Fixed HRESULT size (long -> uint) --- src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs index 5c24aa1c69..86dcec410b 100644 --- a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs +++ b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs @@ -1187,27 +1187,21 @@ namespace Avalonia.Win32.Interop [Flags] public enum OpenFileNameFlags { - OFN_ALLOWMULTISELECT = 0x00000200, - OFN_EXPLORER = 0x00080000, - OFN_HIDEREADONLY = 0x00000004, - OFN_NOREADONLYRETURN = 0x00008000, - OFN_OVERWRITEPROMPT = 0x00000002 - } - public enum HRESULT : long + public enum HRESULT : uint { S_FALSE = 0x0001, S_OK = 0x0000, E_INVALIDARG = 0x80070057, E_OUTOFMEMORY = 0x8007000E, E_NOTIMPL = 0x80004001, - E_UNEXPECTED = 0x8000FFFF, + E_UNEXPECTED = 0x8000FFFF } public enum Icons From c2005c870232256a9471fc4f0e037ffe63a3ed1f Mon Sep 17 00:00:00 2001 From: zii-dmg Date: Sun, 13 May 2018 13:07:04 +0300 Subject: [PATCH 5/5] OleInitialize checks already inited case and throws Win32Exception --- src/Windows/Avalonia.Win32/OleContext.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Windows/Avalonia.Win32/OleContext.cs b/src/Windows/Avalonia.Win32/OleContext.cs index 085c0f8ea9..d454c797fa 100644 --- a/src/Windows/Avalonia.Win32/OleContext.cs +++ b/src/Windows/Avalonia.Win32/OleContext.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using System.Threading; using Avalonia.Platform; using Avalonia.Threading; @@ -26,8 +27,11 @@ namespace Avalonia.Win32 private OleContext() { - if (UnmanagedMethods.OleInitialize(IntPtr.Zero) != UnmanagedMethods.HRESULT.S_OK) - throw new SystemException("Failed to initialize OLE"); + UnmanagedMethods.HRESULT res = UnmanagedMethods.OleInitialize(IntPtr.Zero); + + if (res != UnmanagedMethods.HRESULT.S_OK && + res != UnmanagedMethods.HRESULT.S_FALSE /*already initialized*/) + throw new Win32Exception((int)res, "Failed to initialize OLE"); } private static bool IsValidOleThread()