From 380ada052fa656afc18d236d32feeb0ae27b04bf Mon Sep 17 00:00:00 2001 From: Dariusz Komosinski Date: Wed, 11 Nov 2020 16:21:16 +0100 Subject: [PATCH 1/3] Fix a few not needed allocations. --- .../Templates/DataTemplateExtensions.cs | 27 ++++++++++--------- .../Parsers/BindingExpressionGrammar.cs | 2 +- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/Avalonia.Controls/Templates/DataTemplateExtensions.cs b/src/Avalonia.Controls/Templates/DataTemplateExtensions.cs index f6e28483fd..d4e2c25c42 100644 --- a/src/Avalonia.Controls/Templates/DataTemplateExtensions.cs +++ b/src/Avalonia.Controls/Templates/DataTemplateExtensions.cs @@ -1,6 +1,8 @@ using System.Linq; using Avalonia.LogicalTree; +#nullable enable + namespace Avalonia.Controls.Templates { /// @@ -18,21 +20,23 @@ namespace Avalonia.Controls.Templates /// tree are searched. /// /// The data template or null if no matching data template was found. - public static IDataTemplate FindDataTemplate( + public static IDataTemplate? FindDataTemplate( this IControl control, object data, - IDataTemplate primary = null) + IDataTemplate? primary = null) { if (primary?.Match(data) == true) { return primary; } - foreach (var i in control.GetSelfAndLogicalAncestors().OfType()) + var currentTemplateHost = control as ILogical; + + while (currentTemplateHost != null) { - if (i.IsDataTemplatesInitialized) + if (currentTemplateHost is IDataTemplateHost hostCandidate && hostCandidate.IsDataTemplatesInitialized) { - foreach (IDataTemplate dt in i.DataTemplates) + foreach (IDataTemplate dt in hostCandidate.DataTemplates) { if (dt.Match(data)) { @@ -40,20 +44,19 @@ namespace Avalonia.Controls.Templates } } } + + currentTemplateHost = currentTemplateHost.LogicalParent; } IGlobalDataTemplates global = AvaloniaLocator.Current.GetService(); - if (global != null) + if (global != null && global.IsDataTemplatesInitialized) { - if (global.IsDataTemplatesInitialized) + foreach (IDataTemplate dt in global.DataTemplates) { - foreach (IDataTemplate dt in global.DataTemplates) + if (dt.Match(data)) { - if (dt.Match(data)) - { - return dt; - } + return dt; } } } diff --git a/src/Markup/Avalonia.Markup/Markup/Parsers/BindingExpressionGrammar.cs b/src/Markup/Avalonia.Markup/Markup/Parsers/BindingExpressionGrammar.cs index 8de64e56ff..8e5631e198 100644 --- a/src/Markup/Avalonia.Markup/Markup/Parsers/BindingExpressionGrammar.cs +++ b/src/Markup/Avalonia.Markup/Markup/Parsers/BindingExpressionGrammar.cs @@ -16,7 +16,7 @@ namespace Avalonia.Markup.Parsers internal static class BindingExpressionGrammar { - public static (IList Nodes, SourceMode Mode) Parse(ref CharacterReader r) + public static (List Nodes, SourceMode Mode) Parse(ref CharacterReader r) { var nodes = new List(); var state = State.Start; From 75824a0154d62c99049c1653806deb1f16178e13 Mon Sep 17 00:00:00 2001 From: Dariusz Komosinski Date: Wed, 11 Nov 2020 16:22:59 +0100 Subject: [PATCH 2/3] Remove not needed using. --- src/Avalonia.Controls/Templates/DataTemplateExtensions.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Avalonia.Controls/Templates/DataTemplateExtensions.cs b/src/Avalonia.Controls/Templates/DataTemplateExtensions.cs index d4e2c25c42..2b115aec7e 100644 --- a/src/Avalonia.Controls/Templates/DataTemplateExtensions.cs +++ b/src/Avalonia.Controls/Templates/DataTemplateExtensions.cs @@ -1,4 +1,3 @@ -using System.Linq; using Avalonia.LogicalTree; #nullable enable From 612b1c6c69f142c7d643ee8aaa082e088cb1d3ff Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 12 Nov 2020 20:48:15 +0100 Subject: [PATCH 3/3] Add WS_CLIPCHILDREN to PopupImpl. Needed for embedding chromium, see https://github.com/AvaloniaUI/Avalonia/issues/3281#issuecomment-557615525 --- src/Windows/Avalonia.Win32/PopupImpl.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Windows/Avalonia.Win32/PopupImpl.cs b/src/Windows/Avalonia.Win32/PopupImpl.cs index 57da1c4d66..7fb146899b 100644 --- a/src/Windows/Avalonia.Win32/PopupImpl.cs +++ b/src/Windows/Avalonia.Win32/PopupImpl.cs @@ -69,7 +69,8 @@ namespace Avalonia.Win32 { UnmanagedMethods.WindowStyles style = UnmanagedMethods.WindowStyles.WS_POPUP | - UnmanagedMethods.WindowStyles.WS_CLIPSIBLINGS; + UnmanagedMethods.WindowStyles.WS_CLIPSIBLINGS | + UnmanagedMethods.WindowStyles.WS_CLIPCHILDREN; UnmanagedMethods.WindowStyles exStyle = UnmanagedMethods.WindowStyles.WS_EX_TOOLWINDOW |