Jelajahi Sumber

simplify Layout transform no need to be ContentControl

Andrey Kunchev 7 tahun lalu
induk
melakukan
e4838842a1

+ 14 - 25
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();
         }
     }
-}
+}

+ 0 - 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"/>

+ 0 - 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>

+ 3 - 15
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;
         }
     }
-}
+}