Browse Source

Respect AvaloniaUseCompiledBindingsByDefault in previewer

pull/7247/head
Max Katz 3 years ago
parent
commit
dc0c7e756a
  1. 12
      packages/Avalonia/AvaloniaBuildTasks.targets
  2. 11
      src/Avalonia.DesignerSupport/DesignWindowLoader.cs
  3. 30
      src/Markup/Avalonia.Markup.Xaml.Loader/AvaloniaRuntimeXamlLoader.cs
  4. 1
      src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj
  5. 11
      src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs
  6. 34
      src/Markup/Avalonia.Markup.Xaml/RuntimeXamlLoaderConfiguration.cs
  7. 6
      src/tools/Avalonia.Designer.HostApp/DesignXamlLoader.cs
  8. 4
      tests/Avalonia.Markup.Xaml.UnitTests/XamlTestBase.cs

12
packages/Avalonia/AvaloniaBuildTasks.targets

@ -44,7 +44,17 @@
<PropertyGroup>
<BuildAvaloniaResourcesDependsOn>$(BuildAvaloniaResourcesDependsOn);AddAvaloniaResources;ResolveReferences;_GenerateAvaloniaResourcesDependencyCache</BuildAvaloniaResourcesDependsOn>
</PropertyGroup>
<Target Name="AddXamlMetadataAssemblyAttributes"
BeforeTargets="CoreGenerateAssemblyInfo">
<ItemGroup>
<AssemblyAttribute Include="System.Reflection.AssemblyMetadataAttribute" Condition="$(AvaloniaUseCompiledBindingsByDefault) != ''" >
<_Parameter1>AvaloniaUseCompiledBindingsByDefault</_Parameter1>
<_Parameter2>$(AvaloniaUseCompiledBindingsByDefault)</_Parameter2>
</AssemblyAttribute>
</ItemGroup>
</Target>
<Target Name="_GenerateAvaloniaResourcesDependencyCache" BeforeTargets="GenerateAvaloniaResources">
<ItemGroup>
<CustomAdditionalGenerateAvaloniaResourcesInputs Include="$(IntermediateOutputPath)/Avalonia/Resources.Inputs.cache" />

11
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<AssemblyMetadataAttribute>()
.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)

30
src/Markup/Avalonia.Markup.Xaml.Loader/AvaloniaRuntimeXamlLoader.cs

@ -88,34 +88,4 @@ namespace Avalonia.Markup.Xaml
=> (T)Parse(xaml, localAssembly);
}
public class RuntimeXamlLoaderConfiguration
{
/// <summary>
/// The URI of the XAML being loaded.
/// </summary>
public Uri? BaseUri { get; set; }
/// <summary>
/// Default assembly for clr-namespace:.
/// </summary>
public Assembly LocalAssembly { get; set; }
/// <summary>
/// The optional instance into which the XAML should be loaded.
/// </summary>
public object? RootInstance { get; set; }
/// <summary>
/// Defines is CompiledBinding should be used by default.
/// Default is 'false'.
/// </summary>
public bool UseCompiledBindingsByDefault { get; set; } = false;
/// <summary>
/// Indicates whether the XAML is being loaded in design mode.
/// Default is 'false'.
/// </summary>
public bool DesignMode { get; set; } = false;
}
}

1
src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj

@ -44,6 +44,7 @@
<Compile Include="MarkupExtensions\ReflectionBindingExtension.cs" />
<Compile Include="MarkupExtensions\RelativeSourceExtension.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RuntimeXamlLoaderConfiguration.cs" />
<Compile Include="Styling\StyleInclude.cs" />
<Compile Include="Templates\ControlTemplate.cs" />
<Compile Include="Templates\DataTemplate.cs" />

11
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);
}
/// <summary>
@ -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
});
}
}

34
src/Markup/Avalonia.Markup.Xaml/RuntimeXamlLoaderConfiguration.cs

@ -0,0 +1,34 @@
using System;
using System.Reflection;
namespace Avalonia.Markup.Xaml;
public class RuntimeXamlLoaderConfiguration
{
/// <summary>
/// The URI of the XAML being loaded.
/// </summary>
public Uri? BaseUri { get; set; }
/// <summary>
/// Default assembly for clr-namespace:.
/// </summary>
public Assembly LocalAssembly { get; set; }
/// <summary>
/// The optional instance into which the XAML should be loaded.
/// </summary>
public object? RootInstance { get; set; }
/// <summary>
/// Defines is CompiledBinding should be used by default.
/// Default is 'false'.
/// </summary>
public bool UseCompiledBindingsByDefault { get; set; } = false;
/// <summary>
/// Indicates whether the XAML is being loaded in design mode.
/// Default is 'false'.
/// </summary>
public bool DesignMode { get; set; } = false;
}

6
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);
}
}
}

4
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);
}
}
}

Loading…
Cancel
Save