Browse Source

simplify Layout transform no need to be ContentControl

pull/2066/head
Andrey Kunchev 8 years ago
parent
commit
e4838842a1
  1. 39
      src/Avalonia.Controls/LayoutTransformControl.cs
  2. 1
      src/Avalonia.Themes.Default/DefaultTheme.xaml
  3. 13
      src/Avalonia.Themes.Default/LayoutTransformControl.xaml
  4. 18
      tests/Avalonia.Controls.UnitTests/LayoutTransformControlTests.cs

39
src/Avalonia.Controls/LayoutTransformControl.cs

@ -5,20 +5,17 @@
// http://silverlight.codeplex.com/SourceControl/changeset/view/74775#Release/Silverlight4/Source/Controls.Layout.Toolkit/LayoutTransformer/LayoutTransformer.cs
//
using Avalonia.Controls.Primitives;
using Avalonia.Media;
using Avalonia.VisualTree;
using System;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Reactive.Linq;
using Avalonia.Media;
namespace Avalonia.Controls
{
/// <summary>
/// Control that implements support for transformations as if applied by LayoutTransform.
/// </summary>
public class LayoutTransformControl : ContentControl
public class LayoutTransformControl : Decorator
{
public static readonly AvaloniaProperty<Transform> LayoutTransformProperty =
AvaloniaProperty.Register<LayoutTransformControl, Transform>(nameof(LayoutTransform));
@ -27,6 +24,9 @@ namespace Avalonia.Controls
{
LayoutTransformProperty.Changed
.AddClassHandler<LayoutTransformControl>(x => x.OnLayoutTransformChanged);
ChildProperty.Changed
.AddClassHandler<LayoutTransformControl>(x => x.OnChildChanged);
}
/// <summary>
@ -38,8 +38,7 @@ namespace Avalonia.Controls
set { SetValue(LayoutTransformProperty, value); }
}
public Control TransformRoot => _transformRoot ??
(_transformRoot = this.GetVisualChildren().OfType<Control>().FirstOrDefault());
public IControl TransformRoot => Child;
/// <summary>
/// Provides the behavior for the "Arrange" pass of layout.
@ -132,16 +131,8 @@ namespace Avalonia.Controls
return transformedDesiredSize;
}
/// <summary>
/// Builds the visual tree for the LayoutTransformerControl when a new
/// template is applied.
/// </summary>
protected override void OnTemplateApplied(TemplateAppliedEventArgs e)
private void OnChildChanged(AvaloniaPropertyChangedEventArgs e)
{
base.OnTemplateApplied(e);
_matrixTransform = new MatrixTransform();
if (null != TransformRoot)
{
TransformRoot.RenderTransform = _matrixTransform;
@ -169,14 +160,14 @@ namespace Avalonia.Controls
/// <summary>
/// RenderTransform/MatrixTransform applied to TransformRoot.
/// </summary>
private MatrixTransform _matrixTransform;
private MatrixTransform _matrixTransform = new MatrixTransform();
/// <summary>
/// Transformation matrix corresponding to _matrixTransform.
/// </summary>
private Matrix _transformation;
private IDisposable _transformChangedEvent = null;
private Control _transformRoot;
/// <summary>
/// Returns true if Size a is smaller than Size b in either dimension.
/// </summary>
@ -215,7 +206,8 @@ namespace Avalonia.Controls
/// </remarks>
private void ApplyLayoutTransform()
{
if (LayoutTransform == null) return;
if (LayoutTransform == null)
return;
// Get the transform matrix and apply it
_transformation = RoundMatrix(LayoutTransform.Value, DecimalsAfterRound);
@ -376,11 +368,8 @@ namespace Avalonia.Controls
{
var newTransform = e.NewValue as Transform;
if (_transformChangedEvent != null)
{
_transformChangedEvent.Dispose();
_transformChangedEvent = null;
}
_transformChangedEvent?.Dispose();
_transformChangedEvent = null;
if (newTransform != null)
{
@ -392,4 +381,4 @@ namespace Avalonia.Controls
ApplyLayoutTransform();
}
}
}
}

1
src/Avalonia.Themes.Default/DefaultTheme.xaml

@ -12,7 +12,6 @@
<StyleInclude Source="resm:Avalonia.Themes.Default.DropDownItem.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.GridSplitter.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.ItemsControl.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.LayoutTransformControl.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.ListBox.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.ListBoxItem.xaml?assembly=Avalonia.Themes.Default"/>
<StyleInclude Source="resm:Avalonia.Themes.Default.Menu.xaml?assembly=Avalonia.Themes.Default"/>

13
src/Avalonia.Themes.Default/LayoutTransformControl.xaml

@ -1,13 +0,0 @@
<Style xmlns="https://github.com/avaloniaui" Selector="LayoutTransformControl">
<Setter Property="Template">
<ControlTemplate>
<ContentPresenter Name="PART_ContentPresenter"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
Padding="{TemplateBinding Padding}"/>
</ControlTemplate>
</Setter>
</Style>

18
tests/Avalonia.Controls.UnitTests/LayoutTransformControlTests.cs

@ -1,6 +1,4 @@
using Avalonia.Controls.Presenters;
using Avalonia.Controls.Shapes;
using Avalonia.Controls.Templates;
using Avalonia.Media;
using Xunit;
@ -311,20 +309,10 @@ namespace Avalonia.Controls.UnitTests
{
var lt = new LayoutTransformControl()
{
LayoutTransform = transform,
Template = new FuncControlTemplate<LayoutTransformControl>(
p => new ContentPresenter() { Content = p.Content })
LayoutTransform = transform
};
lt.Content = new Rectangle() { Width = width, Height = height };
lt.ApplyTemplate();
//we need to force create visual child
//so the measure after is correct
(lt.Presenter as ContentPresenter).UpdateChild();
Assert.NotNull(lt.Presenter?.Child);
lt.Child = new Rectangle() { Width = width, Height = height };
lt.Measure(Size.Infinity);
lt.Arrange(new Rect(lt.DesiredSize));
@ -332,4 +320,4 @@ namespace Avalonia.Controls.UnitTests
return lt;
}
}
}
}

Loading…
Cancel
Save