Forráskód Böngészése

Merge remote-tracking branch 'origin/master' into scenegraph

Steven Kirk 8 éve
szülő
commit
aec3c51590

+ 20 - 4
src/Avalonia.Controls/AppBuilderBase.cs

@@ -55,8 +55,7 @@ namespace Avalonia.Controls
         public Action<TAppBuilder> AfterSetupCallback { get; private set; } = builder => { };
 
         /// <summary>
-        /// Gets or sets a method to call before <see cref="Start{TMainWindow}"/> is called on the
-        /// <see cref="Application"/>.
+        /// Gets or sets a method to call before Startis called on the <see cref="Application"/>.
         /// </summary>
         public Action<TAppBuilder> BeforeStartCallback { get; private set; } = builder => { };
 
@@ -94,8 +93,7 @@ namespace Avalonia.Controls
         protected TAppBuilder Self => (TAppBuilder) this;
 
         /// <summary>
-        /// Registers a callback to call before <see cref="Start{TMainWindow}"/> is called on the
-        /// <see cref="Application"/>.
+        /// Registers a callback to call before Start is called on the <see cref="Application"/>.
         /// </summary>
         /// <param name="callback">The callback.</param>
         /// <returns>An <typeparamref name="TAppBuilder"/> instance.</returns>
@@ -129,6 +127,24 @@ namespace Avalonia.Controls
             Instance.Run(window);
         }
 
+        /// <summary>
+        /// Starts the application with the provided instance of <typeparamref name="TMainWindow"/>.
+        /// </summary>
+        /// <typeparam name="TMainWindow">The window type.</typeparam>
+        /// <param name="mainWindow">Instance of type TMainWindow to use when starting the app</param>
+        /// <param name="dataContextProvider">A delegate that will be called to create a data context for the window (optional).</param>
+        public void Start<TMainWindow>(TMainWindow mainWindow, Func<object> dataContextProvider = null)
+            where TMainWindow : Window
+        {
+            Setup();
+            BeforeStartCallback(Self);
+
+            if (dataContextProvider != null)
+                mainWindow.DataContext = dataContextProvider();
+            mainWindow.Show();
+            Instance.Run(mainWindow);
+        }
+
         /// <summary>
         /// Sets up the platform-specific services for the application, but does not run it.
         /// </summary>

+ 3 - 4
src/Avalonia.Layout/Layoutable.cs

@@ -456,10 +456,9 @@ namespace Avalonia.Layout
 
                 ApplyTemplate();
 
-                var constrained = LayoutHelper
-                    .ApplyLayoutConstraints(this, availableSize)
-                    .Deflate(margin);
-
+                var constrained = LayoutHelper.ApplyLayoutConstraints(
+                    this,
+                    availableSize.Deflate(margin));
                 var measured = MeasureOverride(constrained);
 
                 var width = measured.Width;

+ 53 - 0
tests/Avalonia.Layout.UnitTests/MeasureTests.cs

@@ -100,5 +100,58 @@ namespace Avalonia.Layout.UnitTests
 
             Assert.Equal(0, target.DesiredSize.Height);
         }
+
+        [Fact]
+        public void Margin_Should_Affect_AvailableSize()
+        {
+            MeasureTest target;
+
+            var outer = new Decorator
+            {
+                Width = 100,
+                Height = 100,
+                Child = target = new MeasureTest
+                {
+                    Margin = new Thickness(10),
+                }
+            };
+
+            outer.Measure(Size.Infinity);
+
+            Assert.Equal(new Size(80, 80), target.AvailableSize);
+        }
+
+        [Fact]
+        public void Margin_Should_Be_Applied_Before_Width_Height()
+        {
+            MeasureTest target;
+
+            var outer = new Decorator
+            {
+                Width = 100,
+                Height = 100,
+                Child = target = new MeasureTest
+                {
+                    Width = 80,
+                    Height = 80,
+                    Margin = new Thickness(10),
+                }
+            };
+
+            outer.Measure(Size.Infinity);
+
+            Assert.Equal(new Size(80, 80), target.AvailableSize);
+        }
+
+        class MeasureTest : Control
+        {
+            public Size? AvailableSize { get; private set; }
+
+            protected override Size MeasureOverride(Size availableSize)
+            {
+                AvailableSize = availableSize;
+                return availableSize;
+            }
+        }
     }
 }