diff --git a/src/Avalonia.Base/Styling/ITemplate.cs b/src/Avalonia.Base/Styling/ITemplate.cs index 8a130cb3b4..d183d3ff74 100644 --- a/src/Avalonia.Base/Styling/ITemplate.cs +++ b/src/Avalonia.Base/Styling/ITemplate.cs @@ -2,6 +2,6 @@ { public interface ITemplate { - object Build(); + object? Build(); } } diff --git a/src/Avalonia.Controls/Primitives/TemplatedControl.cs b/src/Avalonia.Controls/Primitives/TemplatedControl.cs index e1cf25d89f..44d68fcf30 100644 --- a/src/Avalonia.Controls/Primitives/TemplatedControl.cs +++ b/src/Avalonia.Controls/Primitives/TemplatedControl.cs @@ -286,14 +286,17 @@ namespace Avalonia.Controls.Primitives { Logger.TryGet(LogEventLevel.Verbose, LogArea.Control)?.Log(this, "Creating control template"); - var (child, nameScope) = template.Build(this); - ApplyTemplatedParent(child, this); - ((ISetLogicalParent)child).SetParent(this); - VisualChildren.Add(child); - - var e = new TemplateAppliedEventArgs(nameScope); - OnApplyTemplate(e); - RaiseEvent(e); + if (template.Build(this) is { } templateResult) + { + var (child, nameScope) = templateResult; + ApplyTemplatedParent(child, this); + ((ISetLogicalParent)child).SetParent(this); + VisualChildren.Add(child); + + var e = new TemplateAppliedEventArgs(nameScope); + OnApplyTemplate(e); + RaiseEvent(e); + } } _appliedTemplate = template; diff --git a/src/Avalonia.Controls/Templates/IControlTemplate.cs b/src/Avalonia.Controls/Templates/IControlTemplate.cs index 67e861f6ab..38ad6561ab 100644 --- a/src/Avalonia.Controls/Templates/IControlTemplate.cs +++ b/src/Avalonia.Controls/Templates/IControlTemplate.cs @@ -1,13 +1,11 @@ -using System; using Avalonia.Controls.Primitives; -using Avalonia.Styling; namespace Avalonia.Controls.Templates { /// /// Interface representing a template used to build a . /// - public interface IControlTemplate : ITemplate + public interface IControlTemplate : ITemplate { } diff --git a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj index da739c754c..05e937fc05 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj +++ b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj @@ -58,7 +58,6 @@ - @@ -69,6 +68,7 @@ + diff --git a/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs b/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs index 0b6a2c522f..834fa84b53 100644 --- a/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs +++ b/src/Markup/Avalonia.Markup.Xaml/AvaloniaXamlLoader.cs @@ -1,8 +1,7 @@ using System; using System.Diagnostics.CodeAnalysis; -using System.IO; using Avalonia.Platform; -#nullable enable + namespace Avalonia.Markup.Xaml { /// @@ -79,7 +78,7 @@ namespace Avalonia.Markup.Xaml var compiledLoader = assetLocator.GetAssembly(uri, baseUri) ?.GetType("CompiledAvaloniaXaml.!XamlLoader") - ?.GetMethod("TryLoad", new[] { typeof(System.IServiceProvider), typeof(string) }); + ?.GetMethod("TryLoad", new[] { typeof(IServiceProvider), typeof(string) }); if (compiledLoader != null) { var compiledResult = compiledLoader.Invoke(null, new object?[] { sp, absoluteUri.ToString()}); diff --git a/src/Markup/Avalonia.Markup.Xaml/Converters/AvaloniaPropertyTypeConverter.cs b/src/Markup/Avalonia.Markup.Xaml/Converters/AvaloniaPropertyTypeConverter.cs index 5b660af887..0a5ecebe5d 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Converters/AvaloniaPropertyTypeConverter.cs +++ b/src/Markup/Avalonia.Markup.Xaml/Converters/AvaloniaPropertyTypeConverter.cs @@ -14,18 +14,20 @@ namespace Avalonia.Markup.Xaml.Converters [RequiresUnreferencedCode(TrimmingMessages.XamlTypeResolvedRequiresUnreferenceCodeMessage)] public class AvaloniaPropertyTypeConverter : TypeConverter { - public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) + /// + public override bool CanConvertFrom(ITypeDescriptorContext? context, Type sourceType) { return sourceType == typeof(string); } - public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) + /// + public override object ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value) { var registry = AvaloniaPropertyRegistry.Instance; var (ns, owner, propertyName) = PropertyParser.Parse(new CharacterReader(((string)value).AsSpan())); var ownerType = TryResolveOwnerByName(context, ns, owner); - var targetType = context.GetFirstParent()?.TargetType ?? - context.GetFirstParent