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>
public class AvaloniaXamlLoader
{
private readonly AvaloniaXamlSchemaContext _context = AvaloniaXamlSchemaContext.Create();
public bool IsDesignMode
{
get => _context.IsDesignMode;
set => _context.IsDesignMode = value;
}
public bool IsDesignMode { get; set; }
/// <summary>
/// Initializes a new instance of the <see cref="AvaloniaXamlLoader"/> class.
@ -171,7 +165,8 @@ namespace Avalonia.Markup.Xaml
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(
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.Data;
using Avalonia.Markup.Xaml.MarkupExtensions;
using Avalonia.Markup.Xaml.Styling;
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
{
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)
{
return new AvaloniaXamlSchemaContext(typeProvider ?? new AvaloniaRuntimeTypeProvider());

Loading…
Cancel
Save