diff --git a/src/Avalonia.Themes.Fluent/Controls/DatePicker.xaml b/src/Avalonia.Themes.Fluent/Controls/DatePicker.xaml index 1acb160a17..65dc6591fd 100644 --- a/src/Avalonia.Themes.Fluent/Controls/DatePicker.xaml +++ b/src/Avalonia.Themes.Fluent/Controls/DatePicker.xaml @@ -98,7 +98,7 @@ HorizontalAlignment="Stretch" VerticalAlignment="Stretch" TemplatedControl.IsTemplateFocusTarget="True"> - + - + + ColumnDefinitions="78*,Auto,132*,Auto,78*" + VerticalAlignment="{TemplateBinding VerticalContentAlignment}"> - + ((parent, scope) => + { + var grid = new Grid { Name = "PART_ButtonContentGrid" }; + + grid.Bind(Grid.VerticalAlignmentProperty, new Avalonia.Data.Binding("VerticalContentAlignment") + { + RelativeSource = new Avalonia.Data.RelativeSource(Avalonia.Data.RelativeSourceMode.TemplatedParent) + }); + + var dayText = new TextBlock { Name = "PART_DayTextBlock" }; + var monthText = new TextBlock { Name = "PART_MonthTextBlock" }; + var yearText = new TextBlock { Name = "PART_YearTextBlock" }; + + var firstSpacer = new Avalonia.Controls.Shapes.Rectangle { Name = "PART_FirstSpacer" }; + var secondSpacer = new Avalonia.Controls.Shapes.Rectangle { Name = "PART_SecondSpacer" }; + + scope.Register("PART_ButtonContentGrid", grid); + scope.Register("PART_DayTextBlock", dayText); + scope.Register("PART_MonthTextBlock", monthText); + scope.Register("PART_YearTextBlock", yearText); + scope.Register("PART_FirstSpacer", firstSpacer); + scope.Register("PART_SecondSpacer", secondSpacer); + + grid.Children.Add(dayText); + grid.Children.Add(monthText); + grid.Children.Add(yearText); + grid.Children.Add(firstSpacer); + grid.Children.Add(secondSpacer); + + return grid; + }); + + var root = new Avalonia.UnitTests.TestRoot { Child = picker }; + root.Measure(new Avalonia.Size(100, 100)); + root.Arrange(new Avalonia.Rect(0, 0, 100, 100)); + + var internalGrid = picker.GetVisualDescendants() + .OfType() + .FirstOrDefault(g => g.Name == "PART_ButtonContentGrid"); + + Assert.NotNull(internalGrid); + Assert.Equal(VerticalAlignment.Bottom, internalGrid.VerticalAlignment); + } + } } } diff --git a/tests/Avalonia.Controls.UnitTests/TimePickerTests.cs b/tests/Avalonia.Controls.UnitTests/TimePickerTests.cs index 2c16c19f60..6d929b8f0e 100644 --- a/tests/Avalonia.Controls.UnitTests/TimePickerTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TimePickerTests.cs @@ -11,6 +11,7 @@ using Avalonia.Platform; using Avalonia.Threading; using Avalonia.UnitTests; using Avalonia.VisualTree; +using Avalonia.Layout; using Moq; using Xunit; @@ -484,5 +485,36 @@ namespace Avalonia.Controls.UnitTests var timePicker = new TimePicker(); Assert.Equal(Avalonia.Layout.VerticalAlignment.Stretch, timePicker.VerticalContentAlignment); } + + [Fact] + public void VerticalContentAlignment_Should_Propagate_To_Internal_Grid() + { + using (UnitTestApplication.Start(Services)) + { + var picker = new TimePicker { VerticalContentAlignment = VerticalAlignment.Bottom }; + + picker.Template = new Avalonia.Controls.Templates.FuncControlTemplate((parent, scope) => + { + var grid = new Grid { Name = "PART_FlyoutButtonContentGrid" }; + + grid.Bind(Grid.VerticalAlignmentProperty, new Avalonia.Data.Binding("VerticalContentAlignment") + { + RelativeSource = new Avalonia.Data.RelativeSource(Avalonia.Data.RelativeSourceMode.TemplatedParent) + }); + return grid; + }); + + var root = new Avalonia.UnitTests.TestRoot { Child = picker }; + root.Measure(new Avalonia.Size(100, 100)); + root.Arrange(new Avalonia.Rect(0, 0, 100, 100)); + + var internalGrid = picker.GetVisualDescendants() + .OfType() + .FirstOrDefault(g => g.Name == "PART_FlyoutButtonContentGrid"); + + Assert.NotNull(internalGrid); + Assert.Equal(VerticalAlignment.Bottom, internalGrid.VerticalAlignment); + } + } } }