Browse Source

Use recommended ContentControl pattern.

pull/2264/head
Steven Kirk 7 years ago
parent
commit
fafa695257
  1. 14
      src/Avalonia.Controls/ContentControl.cs
  2. 37
      src/Avalonia.Controls/Primitives/HeaderedContentControl.cs
  3. 21
      src/Avalonia.Controls/Primitives/HeaderedItemsControl.cs
  4. 21
      src/Avalonia.Controls/Primitives/HeaderedSelectingItemsControl.cs
  5. 2
      tests/Avalonia.Controls.UnitTests/HeaderedItemsControlTests .cs
  6. 5
      tests/Avalonia.UnitTests/TestTemplatedRoot.cs

14
src/Avalonia.Controls/ContentControl.cs

@ -97,7 +97,19 @@ namespace Avalonia.Controls
/// <inheritdoc/>
void IContentPresenterHost.RegisterContentPresenter(IContentPresenter presenter)
{
Presenter = presenter;
RegisterContentPresenter(presenter);
}
/// <summary>
/// Called when an <see cref="IContentPresenter"/> is registered with the control.
/// </summary>
/// <param name="presenter">The presenter.</param>
protected virtual void RegisterContentPresenter(IContentPresenter presenter)
{
if (presenter.Name == "PART_ContentPresenter")
{
Presenter = presenter;
}
}
}
}

37
src/Avalonia.Controls/Primitives/HeaderedContentControl.cs

@ -1,6 +1,8 @@
// 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.Mixins;
using Avalonia.Controls.Presenters;
using Avalonia.Controls.Templates;
namespace Avalonia.Controls.Primitives
@ -20,7 +22,18 @@ namespace Avalonia.Controls.Primitives
/// Defines the <see cref="HeaderTemplate"/> property.
/// </summary>
public static readonly StyledProperty<IDataTemplate> HeaderTemplateProperty =
AvaloniaProperty.Register<HeaderedContentControl, IDataTemplate>(nameof(HeaderTemplate));
AvaloniaProperty.Register<HeaderedContentControl, IDataTemplate>(nameof(HeaderTemplate));
/// <summary>
/// Initializes static members of the <see cref="ContentControl"/> class.
/// </summary>
static HeaderedContentControl()
{
ContentControlMixin.Attach<HeaderedContentControl>(
HeaderProperty,
x => x.LogicalChildren,
"PART_HeaderPresenter");
}
/// <summary>
/// Gets or sets the header content.
@ -29,7 +42,16 @@ namespace Avalonia.Controls.Primitives
{
get { return GetValue(HeaderProperty); }
set { SetValue(HeaderProperty, value); }
}
}
/// <summary>
/// Gets the header presenter from the control's template.
/// </summary>
public IContentPresenter HeaderPresenter
{
get;
private set;
}
/// <summary>
/// Gets or sets the data template used to display the header content of the control.
@ -39,5 +61,16 @@ namespace Avalonia.Controls.Primitives
get { return GetValue(HeaderTemplateProperty); }
set { SetValue(HeaderTemplateProperty, value); }
}
/// <inheritdoc/>
protected override void RegisterContentPresenter(IContentPresenter presenter)
{
base.RegisterContentPresenter(presenter);
if (presenter.Name == "PART_HeaderPresenter")
{
HeaderPresenter = presenter;
}
}
}
}

21
src/Avalonia.Controls/Primitives/HeaderedItemsControl.cs

@ -9,7 +9,7 @@ namespace Avalonia.Controls.Primitives
/// <summary>
/// Represents an <see cref="ItemsControl"/> with a related header.
/// </summary>
public class HeaderedItemsControl : ItemsControl
public class HeaderedItemsControl : ItemsControl, IContentPresenterHost
{
/// <summary>
/// Defines the <see cref="Header"/> property.
@ -40,17 +40,28 @@ namespace Avalonia.Controls.Primitives
/// <summary>
/// Gets the header presenter from the control's template.
/// </summary>
public ContentPresenter HeaderPresenter
public IContentPresenter HeaderPresenter
{
get;
private set;
}
/// <inheritdoc/>
protected override void OnTemplateApplied(TemplateAppliedEventArgs e)
void IContentPresenterHost.RegisterContentPresenter(IContentPresenter presenter)
{
HeaderPresenter = e.NameScope.Find<ContentPresenter>("PART_HeaderPresenter");
base.OnTemplateApplied(e);
RegisterContentPresenter(presenter);
}
/// <summary>
/// Called when an <see cref="IContentPresenter"/> is registered with the control.
/// </summary>
/// <param name="presenter">The presenter.</param>
protected virtual void RegisterContentPresenter(IContentPresenter presenter)
{
if (presenter.Name == "PART_HeaderPresenter")
{
HeaderPresenter = presenter;
}
}
}
}

21
src/Avalonia.Controls/Primitives/HeaderedSelectingControl.cs → src/Avalonia.Controls/Primitives/HeaderedSelectingItemsControl.cs

@ -9,7 +9,7 @@ namespace Avalonia.Controls.Primitives
/// <summary>
/// Represents a <see cref="SelectingItemsControl"/> with a related header.
/// </summary>
public class HeaderedSelectingItemsControl : SelectingItemsControl
public class HeaderedSelectingItemsControl : SelectingItemsControl, IContentPresenterHost
{
/// <summary>
/// Defines the <see cref="Header"/> property.
@ -40,17 +40,28 @@ namespace Avalonia.Controls.Primitives
/// <summary>
/// Gets the header presenter from the control's template.
/// </summary>
public ContentPresenter HeaderPresenter
public IContentPresenter HeaderPresenter
{
get;
private set;
}
/// <inheritdoc/>
protected override void OnTemplateApplied(TemplateAppliedEventArgs e)
void IContentPresenterHost.RegisterContentPresenter(IContentPresenter presenter)
{
base.OnTemplateApplied(e);
HeaderPresenter = e.NameScope.Find<ContentPresenter>("PART_HeaderPresenter");
RegisterContentPresenter(presenter);
}
/// <summary>
/// Called when an <see cref="IContentPresenter"/> is registered with the control.
/// </summary>
/// <param name="presenter">The presenter.</param>
protected virtual void RegisterContentPresenter(IContentPresenter presenter)
{
if (presenter.Name == "PART_HeaderPresenter")
{
HeaderPresenter = presenter;
}
}
}
}

2
tests/Avalonia.Controls.UnitTests/HeaderedItemsControlTests .cs

@ -37,7 +37,7 @@ namespace Avalonia.Controls.UnitTests
target.Header = "Foo";
target.ApplyTemplate();
target.HeaderPresenter.UpdateChild();
((ContentPresenter)target.HeaderPresenter).UpdateChild();
var child = target.HeaderPresenter.Child;

5
tests/Avalonia.UnitTests/TestTemplatedRoot.cs

@ -18,7 +18,10 @@ namespace Avalonia.UnitTests
public TestTemplatedRoot()
{
Template = new FuncControlTemplate<TestTemplatedRoot>(x => new ContentPresenter());
Template = new FuncControlTemplate<TestTemplatedRoot>(x => new ContentPresenter
{
Name = "PART_ContentPresenter",
});
}
public event EventHandler<NameScopeEventArgs> Registered

Loading…
Cancel
Save