Browse Source

Remove ControlTemplateResult.

Use `TempateResult<Control>` instead as described in #6666.

Fixes #10525.
pull/11053/head
Steven Kirk 3 years ago
parent
commit
3882bc0217
  1. 4
      src/Avalonia.Controls/Templates/FuncControlTemplate.cs
  2. 18
      src/Avalonia.Controls/Templates/IControlTemplate.cs
  3. 3
      src/Markup/Avalonia.Markup.Xaml/Templates/ControlTemplate.cs
  4. 2
      src/Markup/Avalonia.Markup.Xaml/Templates/DataTemplate.cs
  5. 2
      src/Markup/Avalonia.Markup.Xaml/Templates/ItemsPanelTemplate.cs
  6. 2
      src/Markup/Avalonia.Markup.Xaml/Templates/Template.cs
  7. 5
      src/Markup/Avalonia.Markup.Xaml/Templates/TemplateContent.cs
  8. 2
      src/Markup/Avalonia.Markup.Xaml/Templates/TreeDataTemplate.cs
  9. 2
      src/Markup/Avalonia.Markup.Xaml/XamlIl/Runtime/XamlIlRuntimeHelpers.cs
  10. 2
      tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs
  11. 2
      tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs
  12. 6
      tests/Avalonia.Markup.Xaml.UnitTests/Xaml/ControlTemplateTests.cs

4
src/Avalonia.Controls/Templates/FuncControlTemplate.cs

@ -18,10 +18,10 @@ namespace Avalonia.Controls.Templates
{ {
} }
public new ControlTemplateResult Build(TemplatedControl param) public new TemplateResult<Control> Build(TemplatedControl param)
{ {
var (control, scope) = BuildWithNameScope(param); var (control, scope) = BuildWithNameScope(param);
return new ControlTemplateResult(control, scope); return new(control, scope);
} }
} }
} }

18
src/Avalonia.Controls/Templates/IControlTemplate.cs

@ -5,23 +5,7 @@ namespace Avalonia.Controls.Templates
/// <summary> /// <summary>
/// Interface representing a template used to build a <see cref="TemplatedControl"/>. /// Interface representing a template used to build a <see cref="TemplatedControl"/>.
/// </summary> /// </summary>
public interface IControlTemplate : ITemplate<TemplatedControl, ControlTemplateResult?> public interface IControlTemplate : ITemplate<TemplatedControl, TemplateResult<Control>?>
{ {
} }
public class ControlTemplateResult : TemplateResult<Control>
{
public Control Control { get; }
public ControlTemplateResult(Control control, INameScope nameScope) : base(control, nameScope)
{
Control = control;
}
public new void Deconstruct(out Control control, out INameScope scope)
{
control = Control;
scope = NameScope;
}
}
} }

3
src/Markup/Avalonia.Markup.Xaml/Templates/ControlTemplate.cs

@ -1,4 +1,5 @@
using System; using System;
using Avalonia.Controls;
using Avalonia.Controls.Primitives; using Avalonia.Controls.Primitives;
using Avalonia.Controls.Templates; using Avalonia.Controls.Templates;
using Avalonia.Metadata; using Avalonia.Metadata;
@ -13,6 +14,6 @@ namespace Avalonia.Markup.Xaml.Templates
public Type? TargetType { get; set; } public Type? TargetType { get; set; }
public ControlTemplateResult? Build(TemplatedControl control) => TemplateContent.Load(Content); public TemplateResult<Control>? Build(TemplatedControl control) => TemplateContent.Load(Content);
} }
} }

2
src/Markup/Avalonia.Markup.Xaml/Templates/DataTemplate.cs

@ -30,7 +30,7 @@ namespace Avalonia.Markup.Xaml.Templates
public Control? Build(object? data, Control? existing) public Control? Build(object? data, Control? existing)
{ {
return existing ?? TemplateContent.Load(Content)?.Control; return existing ?? TemplateContent.Load(Content)?.Result;
} }
} }
} }

2
src/Markup/Avalonia.Markup.Xaml/Templates/ItemsPanelTemplate.cs

@ -10,7 +10,7 @@ namespace Avalonia.Markup.Xaml.Templates
[TemplateContent] [TemplateContent]
public object? Content { get; set; } public object? Content { get; set; }
public Panel? Build() => (Panel?)TemplateContent.Load(Content)?.Control; public Panel? Build() => (Panel?)TemplateContent.Load(Content)?.Result;
object? ITemplate.Build() => Build(); object? ITemplate.Build() => Build();
} }

2
src/Markup/Avalonia.Markup.Xaml/Templates/Template.cs

@ -10,7 +10,7 @@ namespace Avalonia.Markup.Xaml.Templates
[TemplateContent] [TemplateContent]
public object? Content { get; set; } public object? Content { get; set; }
public Control? Build() => TemplateContent.Load(Content)?.Control; public Control? Build() => TemplateContent.Load(Content)?.Result;
object? ITemplate.Build() => Build(); object? ITemplate.Build() => Build();
} }

5
src/Markup/Avalonia.Markup.Xaml/Templates/TemplateContent.cs

@ -1,15 +1,16 @@
using System; using System;
using Avalonia.Controls;
using Avalonia.Controls.Templates; using Avalonia.Controls.Templates;
namespace Avalonia.Markup.Xaml.Templates namespace Avalonia.Markup.Xaml.Templates
{ {
public static class TemplateContent public static class TemplateContent
{ {
public static ControlTemplateResult? Load(object? templateContent) public static TemplateResult<Control>? Load(object? templateContent)
{ {
if (templateContent is Func<IServiceProvider?, object?> direct) if (templateContent is Func<IServiceProvider?, object?> direct)
{ {
return (ControlTemplateResult?)direct(null); return (TemplateResult<Control>?)direct(null);
} }
if (templateContent is null) if (templateContent is null)

2
src/Markup/Avalonia.Markup.Xaml/Templates/TreeDataTemplate.cs

@ -54,7 +54,7 @@ namespace Avalonia.Markup.Xaml.Templates
public Control? Build(object? data) public Control? Build(object? data)
{ {
var visualTreeForItem = TemplateContent.Load(Content)?.Control; var visualTreeForItem = TemplateContent.Load(Content)?.Result;
if (visualTreeForItem != null) if (visualTreeForItem != null)
{ {
visualTreeForItem.DataContext = data; visualTreeForItem.DataContext = data;

2
src/Markup/Avalonia.Markup.Xaml/XamlIl/Runtime/XamlIlRuntimeHelpers.cs

@ -35,7 +35,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.Runtime
scope.Complete(); scope.Complete();
if(typeof(T) == typeof(Control)) if(typeof(T) == typeof(Control))
return new ControlTemplateResult((Control)obj, scope); return new TemplateResult<Control>((Control)obj, scope);
return new TemplateResult<T>((T)obj, scope); return new TemplateResult<T>((T)obj, scope);
}; };

2
tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs

@ -1978,7 +1978,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions
public bool Match(object data) => FancyDataType?.IsInstanceOfType(data) ?? true; public bool Match(object data) => FancyDataType?.IsInstanceOfType(data) ?? true;
public Control Build(object data) => TemplateContent.Load(Content)?.Control; public Control Build(object data) => TemplateContent.Load(Content)?.Result;
} }
public class CustomDataTemplateInherit : CustomDataTemplate { } public class CustomDataTemplateInherit : CustomDataTemplate { }

2
tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs

@ -605,7 +605,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml
var control = new ContentControl(); var control = new ContentControl();
var result = (ContentPresenter)template.Build(control).Control; var result = (ContentPresenter)template.Build(control).Result;
Assert.NotNull(result); Assert.NotNull(result);
} }

6
tests/Avalonia.Markup.Xaml.UnitTests/Xaml/ControlTemplateTests.cs

@ -258,7 +258,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml
"; ";
var template = AvaloniaRuntimeXamlLoader.Parse<ControlTemplate>(xaml); var template = AvaloniaRuntimeXamlLoader.Parse<ControlTemplate>(xaml);
var parent = (ContentControl)template.Build(new ContentControl()).Control; var parent = (ContentControl)template.Build(new ContentControl()).Result;
Assert.Equal("parent", parent.Name); Assert.Equal("parent", parent.Name);
@ -283,7 +283,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml
Assert.Equal(typeof(ContentControl), template.TargetType); Assert.Equal(typeof(ContentControl), template.TargetType);
Assert.IsType(typeof(ContentPresenter), template.Build(new ContentControl()).Control); Assert.IsType(typeof(ContentPresenter), template.Build(new ContentControl()).Result);
} }
[Fact] [Fact]
@ -299,7 +299,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml
"; ";
var template = AvaloniaRuntimeXamlLoader.Parse<ControlTemplate>(xaml); var template = AvaloniaRuntimeXamlLoader.Parse<ControlTemplate>(xaml);
var panel = (Panel)template.Build(new ContentControl()).Control; var panel = (Panel)template.Build(new ContentControl()).Result;
Assert.Equal(2, panel.Children.Count); Assert.Equal(2, panel.Children.Count);

Loading…
Cancel
Save