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