diff --git a/src/Avalonia.DesignerSupport/DesignWindowLoader.cs b/src/Avalonia.DesignerSupport/DesignWindowLoader.cs index 5d49ddf6a1..a7d4b96974 100644 --- a/src/Avalonia.DesignerSupport/DesignWindowLoader.cs +++ b/src/Avalonia.DesignerSupport/DesignWindowLoader.cs @@ -12,11 +12,6 @@ namespace Avalonia.DesignerSupport { public class DesignWindowLoader { - static DesignWindowLoader() - { - AvaloniaTypeConverters.Register(typeof(EventInfo), typeof(DesignerEventConverter)); - } - public static Window LoadDesignerWindow(string xaml, string assemblyPath, string xamlFileProjectPath) { Window window; diff --git a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj index 38d207a31d..3c1ef84c54 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj +++ b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj @@ -9,6 +9,7 @@ + diff --git a/src/Markup/Avalonia.Markup.Xaml/AvaloniaTypeConverters.cs b/src/Markup/Avalonia.Markup.Xaml/AvaloniaTypeConverters.cs index c30822aacb..be92b6a8d7 100644 --- a/src/Markup/Avalonia.Markup.Xaml/AvaloniaTypeConverters.cs +++ b/src/Markup/Avalonia.Markup.Xaml/AvaloniaTypeConverters.cs @@ -11,6 +11,7 @@ using Avalonia.Controls.Templates; namespace Avalonia.Markup.Xaml { + using System.Reflection; using Avalonia.Media; /// @@ -41,7 +42,8 @@ namespace Avalonia.Markup.Xaml { typeof(WindowIcon), typeof(IconTypeConverter) }, { typeof(CultureInfo), typeof(CultureInfoConverter) }, { typeof(Uri), typeof(AvaloniaUriTypeConverter) }, - { typeof(FontFamily), typeof(FontFamilyTypeConverter) } + { typeof(FontFamily), typeof(FontFamilyTypeConverter) }, + { typeof(EventInfo), typeof(AvaloniaEventConverter) }, }; internal static Type GetBuiltinTypeConverter(Type type) diff --git a/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs b/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs index b99864b050..800afb3976 100644 --- a/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs +++ b/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs @@ -1,21 +1,20 @@ // Copyright (c) The Avalonia Project. All rights reserved. // Licensed under the MIT license. See licence.md file in the project root for full license information. -using Avalonia.Controls; -using Avalonia.Markup.Data; -using Avalonia.Markup.Xaml.PortableXaml; -using Avalonia.Platform; -using Portable.Xaml; using System; using System.Collections.Generic; using System.ComponentModel; using System.IO; +using System.Linq; using System.Reflection; using System.Runtime.Serialization; -using System.Runtime.Serialization.Json; using System.Text; using System.Xml.Linq; -using System.Linq; +using Avalonia.Controls; +using Avalonia.Markup.Data; +using Avalonia.Markup.Xaml.PortableXaml; +using Avalonia.Platform; +using Portable.Xaml; namespace Avalonia.Markup.Xaml { @@ -24,7 +23,7 @@ namespace Avalonia.Markup.Xaml /// public class AvaloniaXamlLoader { - private readonly AvaloniaXamlSchemaContext _context = GetContext(); + private readonly AvaloniaXamlSchemaContext _context = AvaloniaXamlSchemaContext.Create(); public bool IsDesignMode { @@ -32,22 +31,6 @@ namespace Avalonia.Markup.Xaml set => _context.IsDesignMode = value; } - private static AvaloniaXamlSchemaContext GetContext() - { - var result = AvaloniaLocator.Current.GetService(); - - if (result == null) - { - result = AvaloniaXamlSchemaContext.Create(); - - AvaloniaLocator.CurrentMutable - .Bind() - .ToConstant(result); - } - - return result; - } - /// /// Initializes a new instance of the class. /// diff --git a/src/Avalonia.DesignerSupport/DesignerEventConverter.cs b/src/Markup/Avalonia.Markup.Xaml/Converters/AvaloniaEventConverter.cs similarity index 74% rename from src/Avalonia.DesignerSupport/DesignerEventConverter.cs rename to src/Markup/Avalonia.Markup.Xaml/Converters/AvaloniaEventConverter.cs index b420448698..665e71bfea 100644 --- a/src/Avalonia.DesignerSupport/DesignerEventConverter.cs +++ b/src/Markup/Avalonia.Markup.Xaml/Converters/AvaloniaEventConverter.cs @@ -4,11 +4,13 @@ using System.Globalization; using System.Linq; using System.Linq.Expressions; using System.Reflection; +using Avalonia.Controls; +using Avalonia.Markup.Xaml.PortableXaml; using Portable.Xaml; -namespace Avalonia.DesignerSupport +namespace Avalonia.Markup.Xaml.Converters { - internal class DesignerEventConverter : TypeConverter + internal class AvaloniaEventConverter : TypeConverter { public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { @@ -72,13 +74,23 @@ namespace Avalonia.DesignerSupport } } - // We want to ignore missing events in the designer, so if event handler - // wasn't found create an empty delegate. - var lambdaExpression = Expression.Lambda( - eventType, - Expression.Empty(), - eventParameters.Select(x => Expression.Parameter(x.ParameterType))); - return lambdaExpression.Compile(); + var contextProvider = (IXamlSchemaContextProvider)context.GetService(typeof(IXamlSchemaContextProvider)); + var avaloniaContext = (AvaloniaXamlSchemaContext)contextProvider.SchemaContext; + + if (avaloniaContext.IsDesignMode) + { + // We want to ignore missing events in the designer, so if event handler + // wasn't found create an empty delegate. + var lambdaExpression = Expression.Lambda( + eventType, + Expression.Empty(), + eventParameters.Select(x => Expression.Parameter(x.ParameterType))); + return lambdaExpression.Compile(); + } + else + { + throw new XamlObjectWriterException($"Referenced value method {text} in type {target.GetType()} indicated by event {eventType.FullName} was not found"); + } } } return base.ConvertFrom(context, culture, value); diff --git a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/portable.xaml.github b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/portable.xaml.github index 5d2edfcc1b..ab55261737 160000 --- a/src/Markup/Avalonia.Markup.Xaml/PortableXaml/portable.xaml.github +++ b/src/Markup/Avalonia.Markup.Xaml/PortableXaml/portable.xaml.github @@ -1 +1 @@ -Subproject commit 5d2edfcc1b2988f80303b1b2f3dd2b7c3de53db7 +Subproject commit ab5526173722b8988bc5ca3c03c8752ce89c0975 diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/EventTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/EventTests.cs new file mode 100644 index 0000000000..6ea3015138 --- /dev/null +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/EventTests.cs @@ -0,0 +1,66 @@ +// Copyright (c) The Avalonia Project. All rights reserved. +// Licensed under the MIT license. See licence.md file in the project root for full license information. + +using System; +using Avalonia.Controls; +using Avalonia.Input; +using Portable.Xaml; +using Xunit; + +namespace Avalonia.Markup.Xaml.UnitTests.Xaml +{ + public class EventTests + { + [Fact] + public void Event_Is_Attached() + { + var xaml = @"