diff --git a/readme.md b/readme.md
index eeee39dabe..96cfde3eb2 100644
--- a/readme.md
+++ b/readme.md
@@ -35,7 +35,7 @@ https://ci.appveyor.com/project/AvaloniaUI/Avalonia/branch/master/artifacts
## Documentation
-As mentioned above, Avalonia is still in alpha and as such there's not much documentation yet. You can take a look at the [getting started page](http://avaloniaui.net/guides/quickstart) for an overview of how to get started but probably the best thing to do for now is to already know a little bit about WPF/Silverlight/UWP/XAML and ask questions in our [Gitter room](https://gitter.im/AvaloniaUI/Avalonia).
+As mentioned above, Avalonia is still in alpha and as such there's not much documentation yet. You can take a look at the [getting started page](http://avaloniaui.net/docs/quickstart/) for an overview of how to get started but probably the best thing to do for now is to already know a little bit about WPF/Silverlight/UWP/XAML and ask questions in our [Gitter room](https://gitter.im/AvaloniaUI/Avalonia).
There's also a high-level [architecture document](http://avaloniaui.net/architecture/project-structure) that is currently a little bit out of date, and I've also started writing blog posts on Avalonia at http://grokys.github.io/.
diff --git a/samples/ControlCatalog/ControlCatalog.csproj b/samples/ControlCatalog/ControlCatalog.csproj
index 862de9d320..63b0f4a961 100644
--- a/samples/ControlCatalog/ControlCatalog.csproj
+++ b/samples/ControlCatalog/ControlCatalog.csproj
@@ -1,201 +1,18 @@
- netstandard2.0
- False
- false
+ netstandard2.0
-
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
-
-
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
-
-
-
-
+
-
-
- Designer
-
-
- Designer
-
-
- Designer
-
-
- Designer
-
-
- Designer
-
-
- Designer
-
-
- Designer
-
-
- Designer
-
-
- Designer
-
-
- Designer
-
-
- Designer
-
-
- Designer
-
-
-
- Designer
-
-
- Designer
-
-
- Designer
-
-
- Designer
-
-
- Designer
-
-
- Designer
-
-
- Designer
-
-
- Designer
-
-
- Designer
-
-
- Designer
-
-
- Designer
-
-
- Designer
-
-
-
-
- App.xaml
-
-
- MainView.xaml
-
-
- DecoratedWindow.xaml
-
-
- MainWindow.xaml
-
-
- DialogsPage.xaml
-
-
- BorderPage.xaml
-
-
- AutoCompleteBoxPage.xaml
-
-
- ButtonPage.xaml
-
-
- CalendarPage.xaml
-
-
- CanvasPage.xaml
-
-
- CarouselPage.xaml
-
-
- ContextMenuPage.xaml
-
-
- CheckBoxPage.xaml
-
-
- DropDownPage.xaml
-
-
- DatePickerPage.xaml
-
-
- ExpanderPage.xaml
-
-
- ImagePage.xaml
+
+ %(Filename)
-
- LayoutTransformControlPage.xaml
-
-
- MenuPage.xaml
-
-
- ProgressBarPage.xaml
-
-
- RadioButtonPage.xaml
-
-
- SliderPage.xaml
-
-
- TreeViewPage.xaml
-
-
- TextBoxPage.xaml
-
-
- ToolTipPage.xaml
-
-
- ButtonSpinnerPage.xaml
-
-
- NumericUpDownPage.xaml
-
-
-
-
-
-
-
-
-
-
-
-
+
Designer
+
+
@@ -212,20 +29,6 @@
-
-
-
-
-
- Designer
-
-
-
-
- MSBuild:Compile
-
-
-
-
+
\ No newline at end of file
diff --git a/samples/ControlCatalog/Properties/AssemblyInfo.cs b/samples/ControlCatalog/Properties/AssemblyInfo.cs
deleted file mode 100644
index 30c069d7d8..0000000000
--- a/samples/ControlCatalog/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("ControlCatalog")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
-[assembly: AssemblyProduct("ControlCatalog")]
-[assembly: AssemblyCopyright("Copyright © 2015")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components. If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("61bec86c-f307-4295-b5b8-9428610d7d55")]
-
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/src/Avalonia.Controls/Border.cs b/src/Avalonia.Controls/Border.cs
index 06ad8a4837..8acb3603c9 100644
--- a/src/Avalonia.Controls/Border.cs
+++ b/src/Avalonia.Controls/Border.cs
@@ -43,7 +43,8 @@ namespace Avalonia.Controls
///
static Border()
{
- AffectsRender(BackgroundProperty, BorderBrushProperty);
+ AffectsRender(BackgroundProperty, BorderBrushProperty, BorderThicknessProperty, CornerRadiusProperty);
+ AffectsMeasure(BorderThicknessProperty);
}
///
@@ -114,7 +115,7 @@ namespace Avalonia.Controls
Child.Arrange(new Rect(finalSize).Deflate(padding));
}
- _borderRenderHelper.Update(finalSize, BorderThickness, CornerRadius);
+ _borderRenderHelper.Update(finalSize, BorderThickness, CornerRadius);
return finalSize;
}
diff --git a/src/Avalonia.Controls/Presenters/ContentPresenter.cs b/src/Avalonia.Controls/Presenters/ContentPresenter.cs
index 6acbc047ae..3cc750e20d 100644
--- a/src/Avalonia.Controls/Presenters/ContentPresenter.cs
+++ b/src/Avalonia.Controls/Presenters/ContentPresenter.cs
@@ -89,6 +89,8 @@ namespace Avalonia.Controls.Presenters
///
static ContentPresenter()
{
+ AffectsRender(BackgroundProperty, BorderBrushProperty, BorderThicknessProperty, CornerRadiusProperty);
+ AffectsMeasure(BorderThicknessProperty);
ContentProperty.Changed.AddClassHandler(x => x.ContentChanged);
ContentTemplateProperty.Changed.AddClassHandler(x => x.ContentChanged);
TemplatedParentProperty.Changed.AddClassHandler(x => x.TemplatedParentChanged);
@@ -383,7 +385,7 @@ namespace Avalonia.Controls.Presenters
{
size = size.WithWidth(Math.Min(size.Width, DesiredSize.Width - padding.Left - padding.Right));
}
-
+
if (verticalContentAlignment != VerticalAlignment.Stretch)
{
size = size.WithHeight(Math.Min(size.Height, DesiredSize.Height - padding.Top - padding.Bottom));
@@ -425,7 +427,7 @@ namespace Avalonia.Controls.Presenters
originY = Math.Floor(originY * scale) / scale;
}
- Child.Arrange(new Rect(originX, originY, size.Width, size.Height));
+ Child.Arrange(new Rect(originX, originY, Math.Max(0, size.Width), Math.Max(0, size.Height)));
return finalSize;
}
diff --git a/src/Avalonia.Diagnostics/ViewModels/DevToolsViewModel.cs b/src/Avalonia.Diagnostics/ViewModels/DevToolsViewModel.cs
index 2d3f978462..555a0b2354 100644
--- a/src/Avalonia.Diagnostics/ViewModels/DevToolsViewModel.cs
+++ b/src/Avalonia.Diagnostics/ViewModels/DevToolsViewModel.cs
@@ -86,7 +86,7 @@ namespace Avalonia.Diagnostics.ViewModels
private void UpdateFocusedControl()
{
- _focusedControl = KeyboardDevice.Instance.FocusedElement?.GetType().Name;
+ FocusedControl = KeyboardDevice.Instance.FocusedElement?.GetType().Name;
}
}
}
diff --git a/src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs b/src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs
index 6005ee8b8f..799380cb85 100644
--- a/src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs
+++ b/src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs
@@ -167,7 +167,9 @@ namespace Avalonia.Rendering.SceneGraph
using (context.PushPostTransform(m))
using (context.PushTransformContainer())
{
- var clipBounds = bounds.TransformToAABB(contextImpl.Transform).Intersect(clip);
+ var clipBounds = clipToBounds ?
+ bounds.TransformToAABB(contextImpl.Transform).Intersect(clip) :
+ clip;
forceRecurse = forceRecurse ||
node.ClipBounds != clipBounds ||
diff --git a/tests/Avalonia.Controls.UnitTests/BorderTests.cs b/tests/Avalonia.Controls.UnitTests/BorderTests.cs
index 3660a7b4ca..9a6a041ec7 100644
--- a/tests/Avalonia.Controls.UnitTests/BorderTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/BorderTests.cs
@@ -20,5 +20,27 @@ namespace Avalonia.Controls.UnitTests
Assert.Equal(new Size(20, 20), target.DesiredSize);
}
+
+ [Fact]
+ public void Child_Should_Arrange_With_Zero_Height_Width_If_Padding_Greater_Than_Child_Size()
+ {
+ Border content;
+
+ var target = new Border
+ {
+ Padding = new Thickness(6),
+ MaxHeight = 12,
+ MaxWidth = 12,
+ Child = content = new Border
+ {
+ Height = 0,
+ Width = 0
+ }
+ };
+
+ target.Arrange(new Rect(0, 0, 100, 100));
+
+ Assert.Equal(new Rect(6, 6, 0, 0), content.Bounds);
+ }
}
}
diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Layout.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Layout.cs
index b3c617c4ab..2c1074aa9a 100644
--- a/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Layout.cs
+++ b/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Layout.cs
@@ -210,5 +210,30 @@ namespace Avalonia.Controls.UnitTests.Presenters
Assert.Equal(new Rect(84, 0, 16, 16), content.Bounds);
}
+
+ [Fact]
+ public void Child_Arrange_With_Zero_Height_When_Padding_Height_Greater_Than_Child_Height()
+ {
+ Border content;
+ var target = new ContentPresenter
+ {
+ Padding = new Thickness(32),
+ MaxHeight = 32,
+ MaxWidth = 32,
+ HorizontalContentAlignment = HorizontalAlignment.Center,
+ VerticalContentAlignment = VerticalAlignment.Center,
+ Content = content = new Border
+ {
+ Height = 0,
+ Width = 0,
+ },
+ };
+
+ target.UpdateChild();
+
+ target.Arrange(new Rect(0, 0, 100, 100));
+
+ Assert.Equal(new Rect(48, 48, 0, 0), content.Bounds);
+ }
}
}
\ No newline at end of file
diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs
index 2ada7bdbba..df4584518e 100644
--- a/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs
+++ b/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs
@@ -83,6 +83,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
Margin = new Thickness(10, 20, 30, 40),
Child = canvas = new Canvas
{
+ ClipToBounds = true,
Background = Brushes.AliceBlue,
}
}
@@ -129,6 +130,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
(border = new Border
{
Background = Brushes.AliceBlue,
+ ClipToBounds = true,
Width = 100,
Height = 100,
[Canvas.LeftProperty] = 50,
@@ -173,6 +175,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
(border = new Border
{
Background = Brushes.AliceBlue,
+ ClipToBounds = true,
Width = 100,
Height = 100,
[Canvas.LeftProperty] = 50,
@@ -254,6 +257,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
Margin = new Thickness(24, 26),
Child = target = new Border
{
+ ClipToBounds = true,
Margin = new Thickness(26, 24),
Width = 100,
Height = 100,
@@ -515,6 +519,50 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph
}
}
+ [Fact]
+ public void Should_Update_ClipBounds_For_Negative_Margin()
+ {
+ using (TestApplication())
+ {
+ Decorator decorator;
+ Border border;
+ var tree = new TestRoot
+ {
+ Width = 100,
+ Height = 100,
+ Child = decorator = new Decorator
+ {
+ Margin = new Thickness(0, 10, 0, 0),
+ Child = border = new Border
+ {
+ Background = Brushes.Red,
+ ClipToBounds = true,
+ Margin = new Thickness(0, -5, 0, 0),
+ }
+ }
+ };
+
+ var layout = AvaloniaLocator.Current.GetService();
+ layout.ExecuteInitialLayoutPass(tree);
+
+ var scene = new Scene(tree);
+ var sceneBuilder = new SceneBuilder();
+ sceneBuilder.UpdateAll(scene);
+
+ var borderNode = scene.FindNode(border);
+ Assert.Equal(new Rect(0, 5, 100, 95), borderNode.ClipBounds);
+
+ border.Margin = new Thickness(0, -8, 0, 0);
+ layout.ExecuteLayoutPass();
+
+ scene = scene.CloneScene();
+ sceneBuilder.Update(scene, border);
+
+ borderNode = scene.FindNode(border);
+ Assert.Equal(new Rect(0, 2, 100, 98), borderNode.ClipBounds);
+ }
+ }
+
[Fact]
public void Should_Update_Descendent_Tranform_When_Margin_Changed()
{