Browse Source

Don't create a schema context each time.

The change in the previous commit to create a new `AvaloniaXamlSchemaContext` for each instance of `AvaloniaXamlLoader` had a negative performance effect. Instead, keep two instances of the schema context around: one for normal loading and one for design-time loading.
pull/2307/head
Steven Kirk 7 years ago
parent
commit
ce3138efda
  1. 11
      src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs
  2. 45
      src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlSchemaContext.cs

11
src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs

@ -23,13 +23,7 @@ namespace Avalonia.Markup.Xaml
/// </summary> /// </summary>
public class AvaloniaXamlLoader public class AvaloniaXamlLoader
{ {
private readonly AvaloniaXamlSchemaContext _context = AvaloniaXamlSchemaContext.Create(); public bool IsDesignMode { get; set; }
public bool IsDesignMode
{
get => _context.IsDesignMode;
set => _context.IsDesignMode = value;
}
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="AvaloniaXamlLoader"/> class. /// Initializes a new instance of the <see cref="AvaloniaXamlLoader"/> class.
@ -171,7 +165,8 @@ namespace Avalonia.Markup.Xaml
LocalAssembly = localAssembly LocalAssembly = localAssembly
}; };
var reader = new XamlXmlReader(stream, _context, readerSettings); var context = IsDesignMode ? AvaloniaXamlSchemaContext.DesignInstance : AvaloniaXamlSchemaContext.Instance;
var reader = new XamlXmlReader(stream, context, readerSettings);
object result = LoadFromReader( object result = LoadFromReader(
reader, reader,

45
src/Markup/Avalonia.Markup.Xaml/PortableXaml/AvaloniaXamlSchemaContext.cs

@ -1,21 +1,48 @@
using Avalonia.Data; using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Avalonia.Data;
using Avalonia.Markup.Xaml.Context; using Avalonia.Markup.Xaml.Context;
using Avalonia.Markup.Data;
using Avalonia.Markup.Xaml.MarkupExtensions; using Avalonia.Markup.Xaml.MarkupExtensions;
using Avalonia.Markup.Xaml.Styling; using Avalonia.Markup.Xaml.Styling;
using Portable.Xaml; using Portable.Xaml;
using Portable.Xaml.ComponentModel;
using System.ComponentModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace Avalonia.Markup.Xaml.PortableXaml namespace Avalonia.Markup.Xaml.PortableXaml
{ {
internal class AvaloniaXamlSchemaContext : XamlSchemaContext internal class AvaloniaXamlSchemaContext : XamlSchemaContext
{ {
public bool IsDesignMode { get; set; } private static AvaloniaXamlSchemaContext s_instance;
private static AvaloniaXamlSchemaContext s_designInstance;
public static AvaloniaXamlSchemaContext Instance
{
get
{
if (s_instance == null)
{
s_instance = Create();
}
return s_instance;
}
}
public static AvaloniaXamlSchemaContext DesignInstance
{
get
{
if (s_designInstance == null)
{
s_designInstance = Create();
s_designInstance.IsDesignMode = true;
}
return s_designInstance;
}
}
public bool IsDesignMode { get; private set; }
public static AvaloniaXamlSchemaContext Create(IRuntimeTypeProvider typeProvider = null) public static AvaloniaXamlSchemaContext Create(IRuntimeTypeProvider typeProvider = null)
{ {
return new AvaloniaXamlSchemaContext(typeProvider ?? new AvaloniaRuntimeTypeProvider()); return new AvaloniaXamlSchemaContext(typeProvider ?? new AvaloniaRuntimeTypeProvider());

Loading…
Cancel
Save