From dc0c7e756aaf95bd5efd0d2a0e00648544751b96 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Sun, 13 Nov 2022 23:42:46 -0500 Subject: [PATCH] Respect AvaloniaUseCompiledBindingsByDefault in previewer --- packages/Avalonia/AvaloniaBuildTasks.targets | 12 ++++++- .../DesignWindowLoader.cs | 11 +++++- .../AvaloniaRuntimeXamlLoader.cs | 30 ---------------- .../Avalonia.Markup.Xaml.csproj | 1 + .../AvaloniaXamlLoader.cs | 11 +++--- .../RuntimeXamlLoaderConfiguration.cs | 34 +++++++++++++++++++ .../DesignXamlLoader.cs | 6 ++-- .../XamlTestBase.cs | 4 +-- 8 files changed, 68 insertions(+), 41 deletions(-) create mode 100644 src/Markup/Avalonia.Markup.Xaml/RuntimeXamlLoaderConfiguration.cs diff --git a/packages/Avalonia/AvaloniaBuildTasks.targets b/packages/Avalonia/AvaloniaBuildTasks.targets index 1f56bba3bd..961992ebbc 100644 --- a/packages/Avalonia/AvaloniaBuildTasks.targets +++ b/packages/Avalonia/AvaloniaBuildTasks.targets @@ -44,7 +44,17 @@ $(BuildAvaloniaResourcesDependsOn);AddAvaloniaResources;ResolveReferences;_GenerateAvaloniaResourcesDependencyCache - + + + + + <_Parameter1>AvaloniaUseCompiledBindingsByDefault + <_Parameter2>$(AvaloniaUseCompiledBindingsByDefault) + + + + diff --git a/src/Avalonia.DesignerSupport/DesignWindowLoader.cs b/src/Avalonia.DesignerSupport/DesignWindowLoader.cs index 811f9c7baa..1e1b550a15 100644 --- a/src/Avalonia.DesignerSupport/DesignWindowLoader.cs +++ b/src/Avalonia.DesignerSupport/DesignWindowLoader.cs @@ -35,7 +35,16 @@ namespace Avalonia.DesignerSupport } var localAsm = assemblyPath != null ? Assembly.LoadFile(Path.GetFullPath(assemblyPath)) : null; - var loaded = loader.Load(stream, localAsm, null, baseUri, true); + var useCompiledBindings = localAsm?.GetCustomAttributes() + .FirstOrDefault(a => a.Key == "AvaloniaUseCompiledBindingsByDefault")?.Value; + + var loaded = loader.Load(stream, new RuntimeXamlLoaderConfiguration + { + LocalAssembly = localAsm, + BaseUri = baseUri, + DesignMode = true, + UseCompiledBindingsByDefault = bool.TryParse(useCompiledBindings, out var tempBool) && tempBool + }); var style = loaded as IStyle; var resources = loaded as ResourceDictionary; if (style != null) diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/AvaloniaRuntimeXamlLoader.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/AvaloniaRuntimeXamlLoader.cs index 65baa8c486..c8464d83af 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/AvaloniaRuntimeXamlLoader.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/AvaloniaRuntimeXamlLoader.cs @@ -88,34 +88,4 @@ namespace Avalonia.Markup.Xaml => (T)Parse(xaml, localAssembly); } - - public class RuntimeXamlLoaderConfiguration - { - /// - /// The URI of the XAML being loaded. - /// - public Uri? BaseUri { get; set; } - - /// - /// Default assembly for clr-namespace:. - /// - public Assembly LocalAssembly { get; set; } - - /// - /// The optional instance into which the XAML should be loaded. - /// - public object? RootInstance { get; set; } - - /// - /// Defines is CompiledBinding should be used by default. - /// Default is 'false'. - /// - public bool UseCompiledBindingsByDefault { get; set; } = false; - - /// - /// Indicates whether the XAML is being loaded in design mode. - /// Default is 'false'. - /// - public bool DesignMode { get; set; } = false; - } } diff --git a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj index f5bf14c2a4..070f0c1cc3 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj +++ b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj @@ -44,6 +44,7 @@ + diff --git a/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs b/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs index e5c6b72d12..578af64abb 100644 --- a/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs +++ b/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs @@ -1,8 +1,5 @@ using System; using System.IO; -using System.Reflection; -using System.Text; -using Avalonia.Markup.Xaml.XamlIl; using Avalonia.Platform; namespace Avalonia.Markup.Xaml @@ -14,7 +11,7 @@ namespace Avalonia.Markup.Xaml { public interface IRuntimeXamlLoader { - object Load(Stream stream, Assembly localAsm, object o, Uri baseUri, bool designMode); + object Load(Stream stream, RuntimeXamlLoaderConfiguration configuration); } /// @@ -67,7 +64,11 @@ namespace Avalonia.Markup.Xaml using (var stream = asset.stream) { var absoluteUri = uri.IsAbsoluteUri ? uri : new Uri(baseUri, uri); - return runtimeLoader.Load(stream, asset.assembly, null, absoluteUri, false); + return runtimeLoader.Load(stream, new RuntimeXamlLoaderConfiguration + { + LocalAssembly = asset.assembly, + BaseUri = absoluteUri + }); } } diff --git a/src/Markup/Avalonia.Markup.Xaml/RuntimeXamlLoaderConfiguration.cs b/src/Markup/Avalonia.Markup.Xaml/RuntimeXamlLoaderConfiguration.cs new file mode 100644 index 0000000000..aae19e67a6 --- /dev/null +++ b/src/Markup/Avalonia.Markup.Xaml/RuntimeXamlLoaderConfiguration.cs @@ -0,0 +1,34 @@ +using System; +using System.Reflection; + +namespace Avalonia.Markup.Xaml; + +public class RuntimeXamlLoaderConfiguration +{ + /// + /// The URI of the XAML being loaded. + /// + public Uri? BaseUri { get; set; } + + /// + /// Default assembly for clr-namespace:. + /// + public Assembly LocalAssembly { get; set; } + + /// + /// The optional instance into which the XAML should be loaded. + /// + public object? RootInstance { get; set; } + + /// + /// Defines is CompiledBinding should be used by default. + /// Default is 'false'. + /// + public bool UseCompiledBindingsByDefault { get; set; } = false; + + /// + /// Indicates whether the XAML is being loaded in design mode. + /// Default is 'false'. + /// + public bool DesignMode { get; set; } = false; +} diff --git a/src/tools/Avalonia.Designer.HostApp/DesignXamlLoader.cs b/src/tools/Avalonia.Designer.HostApp/DesignXamlLoader.cs index 7af29a56a1..7009151998 100644 --- a/src/tools/Avalonia.Designer.HostApp/DesignXamlLoader.cs +++ b/src/tools/Avalonia.Designer.HostApp/DesignXamlLoader.cs @@ -8,9 +8,11 @@ namespace Avalonia.Designer.HostApp { class DesignXamlLoader : AvaloniaXamlLoader.IRuntimeXamlLoader { - public object Load(Stream stream, Assembly localAsm, object o, Uri baseUri, bool designMode) + public object Load(Stream stream, RuntimeXamlLoaderConfiguration configuration) { - return AvaloniaXamlIlRuntimeCompiler.Load(stream, localAsm, o, baseUri, designMode); + return AvaloniaXamlIlRuntimeCompiler.Load(stream, + configuration.LocalAssembly, configuration.RootInstance, configuration.BaseUri, + configuration.DesignMode, configuration.UseCompiledBindingsByDefault); } } } diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/XamlTestBase.cs b/tests/Avalonia.Markup.Xaml.UnitTests/XamlTestBase.cs index 2bc82d1353..2fc4867b35 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/XamlTestBase.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/XamlTestBase.cs @@ -20,8 +20,8 @@ namespace Avalonia.Markup.Xaml.UnitTests class TestXamlLoaderShim : AvaloniaXamlLoader.IRuntimeXamlLoader { - public object Load(Stream stream, Assembly localAsm, object o, Uri baseUri, bool designMode) - => AvaloniaRuntimeXamlLoader.Load(stream, localAsm, o, baseUri, designMode); + public object Load(Stream stream, RuntimeXamlLoaderConfiguration configuration) + => AvaloniaRuntimeXamlLoader.Load(stream, configuration); } } }