From f4d4bdde1036ab3e160e805a40dea127d72616a5 Mon Sep 17 00:00:00 2001 From: NaBian <836904362@qq.com> Date: Wed, 14 Apr 2021 23:28:42 +0800 Subject: [PATCH] fixed #784 and optimized MeasureChild method --- .../Controls/Panel/RelativePanel.cs | 78 ++++++++++--------- 1 file changed, 40 insertions(+), 38 deletions(-) diff --git a/src/Shared/HandyControl_Shared/Controls/Panel/RelativePanel.cs b/src/Shared/HandyControl_Shared/Controls/Panel/RelativePanel.cs index 6b84450a..83c4897f 100644 --- a/src/Shared/HandyControl_Shared/Controls/Panel/RelativePanel.cs +++ b/src/Shared/HandyControl_Shared/Controls/Panel/RelativePanel.cs @@ -27,7 +27,7 @@ namespace HandyControl.Controls => element.SetValue(AlignLeftWithPanelProperty, ValueBoxes.BooleanBox(value)); public static bool GetAlignLeftWithPanel(DependencyObject element) - => (bool) element.GetValue(AlignLeftWithPanelProperty); + => (bool)element.GetValue(AlignLeftWithPanelProperty); public static readonly DependencyProperty AlignTopWithPanelProperty = DependencyProperty.RegisterAttached( "AlignTopWithPanel", typeof(bool), typeof(RelativePanel), new FrameworkPropertyMetadata(ValueBoxes.FalseBox, FrameworkPropertyMetadataOptions.AffectsRender)); @@ -36,7 +36,7 @@ namespace HandyControl.Controls => element.SetValue(AlignTopWithPanelProperty, ValueBoxes.BooleanBox(value)); public static bool GetAlignTopWithPanel(DependencyObject element) - => (bool) element.GetValue(AlignTopWithPanelProperty); + => (bool)element.GetValue(AlignTopWithPanelProperty); public static readonly DependencyProperty AlignRightWithPanelProperty = DependencyProperty.RegisterAttached( "AlignRightWithPanel", typeof(bool), typeof(RelativePanel), new FrameworkPropertyMetadata(ValueBoxes.FalseBox, FrameworkPropertyMetadataOptions.AffectsRender)); @@ -45,7 +45,7 @@ namespace HandyControl.Controls => element.SetValue(AlignRightWithPanelProperty, ValueBoxes.BooleanBox(value)); public static bool GetAlignRightWithPanel(DependencyObject element) - => (bool) element.GetValue(AlignRightWithPanelProperty); + => (bool)element.GetValue(AlignRightWithPanelProperty); public static readonly DependencyProperty AlignBottomWithPanelProperty = DependencyProperty.RegisterAttached( "AlignBottomWithPanel", typeof(bool), typeof(RelativePanel), new FrameworkPropertyMetadata(ValueBoxes.FalseBox, FrameworkPropertyMetadataOptions.AffectsRender)); @@ -54,7 +54,7 @@ namespace HandyControl.Controls => element.SetValue(AlignBottomWithPanelProperty, ValueBoxes.BooleanBox(value)); public static bool GetAlignBottomWithPanel(DependencyObject element) - => (bool) element.GetValue(AlignBottomWithPanelProperty); + => (bool)element.GetValue(AlignBottomWithPanelProperty); #endregion @@ -68,7 +68,7 @@ namespace HandyControl.Controls [TypeConverter(typeof(NameReferenceConverter))] public static UIElement GetAlignLeftWith(DependencyObject element) - => (UIElement) element.GetValue(AlignLeftWithProperty); + => (UIElement)element.GetValue(AlignLeftWithProperty); public static readonly DependencyProperty AlignTopWithProperty = DependencyProperty.RegisterAttached( "AlignTopWith", typeof(UIElement), typeof(RelativePanel), new FrameworkPropertyMetadata(default(UIElement), FrameworkPropertyMetadataOptions.AffectsRender)); @@ -78,7 +78,7 @@ namespace HandyControl.Controls [TypeConverter(typeof(NameReferenceConverter))] public static UIElement GetAlignTopWith(DependencyObject element) - => (UIElement) element.GetValue(AlignTopWithProperty); + => (UIElement)element.GetValue(AlignTopWithProperty); public static readonly DependencyProperty AlignRightWithProperty = DependencyProperty.RegisterAttached( "AlignRightWith", typeof(UIElement), typeof(RelativePanel), new FrameworkPropertyMetadata(default(UIElement), FrameworkPropertyMetadataOptions.AffectsRender)); @@ -88,7 +88,7 @@ namespace HandyControl.Controls [TypeConverter(typeof(NameReferenceConverter))] public static UIElement GetAlignRightWith(DependencyObject element) - => (UIElement) element.GetValue(AlignRightWithProperty); + => (UIElement)element.GetValue(AlignRightWithProperty); public static readonly DependencyProperty AlignBottomWithProperty = DependencyProperty.RegisterAttached( "AlignBottomWith", typeof(UIElement), typeof(RelativePanel), new FrameworkPropertyMetadata(default(UIElement), FrameworkPropertyMetadataOptions.AffectsRender)); @@ -98,7 +98,7 @@ namespace HandyControl.Controls [TypeConverter(typeof(NameReferenceConverter))] public static UIElement GetAlignBottomWith(DependencyObject element) - => (UIElement) element.GetValue(AlignBottomWithProperty); + => (UIElement)element.GetValue(AlignBottomWithProperty); #endregion @@ -112,7 +112,7 @@ namespace HandyControl.Controls [TypeConverter(typeof(NameReferenceConverter))] public static UIElement GetLeftOf(DependencyObject element) - => (UIElement) element.GetValue(LeftOfProperty); + => (UIElement)element.GetValue(LeftOfProperty); public static readonly DependencyProperty AboveProperty = DependencyProperty.RegisterAttached( "Above", typeof(UIElement), typeof(RelativePanel), new FrameworkPropertyMetadata(default(UIElement), FrameworkPropertyMetadataOptions.AffectsRender)); @@ -122,7 +122,7 @@ namespace HandyControl.Controls [TypeConverter(typeof(NameReferenceConverter))] public static UIElement GetAbove(DependencyObject element) - => (UIElement) element.GetValue(AboveProperty); + => (UIElement)element.GetValue(AboveProperty); public static readonly DependencyProperty RightOfProperty = DependencyProperty.RegisterAttached( "RightOf", typeof(UIElement), typeof(RelativePanel), new FrameworkPropertyMetadata(default(UIElement), FrameworkPropertyMetadataOptions.AffectsRender)); @@ -132,7 +132,7 @@ namespace HandyControl.Controls [TypeConverter(typeof(NameReferenceConverter))] public static UIElement GetRightOf(DependencyObject element) - => (UIElement) element.GetValue(RightOfProperty); + => (UIElement)element.GetValue(RightOfProperty); public static readonly DependencyProperty BelowProperty = DependencyProperty.RegisterAttached( "Below", typeof(UIElement), typeof(RelativePanel), new FrameworkPropertyMetadata(default(UIElement), FrameworkPropertyMetadataOptions.AffectsRender)); @@ -142,7 +142,7 @@ namespace HandyControl.Controls [TypeConverter(typeof(NameReferenceConverter))] public static UIElement GetBelow(DependencyObject element) - => (UIElement) element.GetValue(BelowProperty); + => (UIElement)element.GetValue(BelowProperty); #endregion @@ -155,7 +155,7 @@ namespace HandyControl.Controls => element.SetValue(AlignHorizontalCenterWithPanelProperty, ValueBoxes.BooleanBox(value)); public static bool GetAlignHorizontalCenterWithPanel(DependencyObject element) - => (bool) element.GetValue(AlignHorizontalCenterWithPanelProperty); + => (bool)element.GetValue(AlignHorizontalCenterWithPanelProperty); public static readonly DependencyProperty AlignVerticalCenterWithPanelProperty = DependencyProperty.RegisterAttached( "AlignVerticalCenterWithPanel", typeof(bool), typeof(RelativePanel), new FrameworkPropertyMetadata(ValueBoxes.FalseBox, FrameworkPropertyMetadataOptions.AffectsRender)); @@ -164,7 +164,7 @@ namespace HandyControl.Controls => element.SetValue(AlignVerticalCenterWithPanelProperty, ValueBoxes.BooleanBox(value)); public static bool GetAlignVerticalCenterWithPanel(DependencyObject element) - => (bool) element.GetValue(AlignVerticalCenterWithPanelProperty); + => (bool)element.GetValue(AlignVerticalCenterWithPanelProperty); public static readonly DependencyProperty AlignHorizontalCenterWithProperty = DependencyProperty.RegisterAttached( "AlignHorizontalCenterWith", typeof(UIElement), typeof(RelativePanel), new FrameworkPropertyMetadata(default(UIElement), FrameworkPropertyMetadataOptions.AffectsRender)); @@ -174,7 +174,7 @@ namespace HandyControl.Controls [TypeConverter(typeof(NameReferenceConverter))] public static UIElement GetAlignHorizontalCenterWith(DependencyObject element) - => (UIElement) element.GetValue(AlignHorizontalCenterWithProperty); + => (UIElement)element.GetValue(AlignHorizontalCenterWithProperty); public static readonly DependencyProperty AlignVerticalCenterWithProperty = DependencyProperty.RegisterAttached( "AlignVerticalCenterWith", typeof(UIElement), typeof(RelativePanel), new FrameworkPropertyMetadata(default(UIElement), FrameworkPropertyMetadataOptions.AffectsRender)); @@ -184,7 +184,7 @@ namespace HandyControl.Controls [TypeConverter(typeof(NameReferenceConverter))] public static UIElement GetAlignVerticalCenterWith(DependencyObject element) - => (UIElement) element.GetValue(AlignVerticalCenterWithProperty); + => (UIElement)element.GetValue(AlignVerticalCenterWithProperty); #endregion @@ -218,7 +218,7 @@ namespace HandyControl.Controls #region Calc AvailableSize _childGraph.Reset(false); - var boundingSize = _childGraph.GetBoundingSize(Width.IsNaN(), Height.IsNaN()); + var boundingSize = _childGraph.GetBoundingSize(Width.IsNaN(), Height.IsNaN(), availableSize); _childGraph.Reset(); _childGraph.Measure(boundingSize); return boundingSize; @@ -454,6 +454,8 @@ namespace HandyControl.Controls private void MeasureChild(GraphNode node) { + var availableSize = AvailableSize; + var child = node.Element; child.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); node.OriginDesiredSize = child.DesiredSize; @@ -502,10 +504,10 @@ namespace HandyControl.Controls #region Measure - var availableHeight = AvailableSize.Height - node.Top - node.Bottom; + var availableHeight = availableSize.Height - node.Top - node.Bottom; if (availableHeight.IsNaN()) { - availableHeight = AvailableSize.Height; + availableHeight = availableSize.Height; if (!node.Top.IsNaN() && node.Bottom.IsNaN()) { @@ -517,10 +519,10 @@ namespace HandyControl.Controls } } - var availableWidth = AvailableSize.Width - node.Left - node.Right; + var availableWidth = availableSize.Width - node.Left - node.Right; if (availableWidth.IsNaN()) { - availableWidth = AvailableSize.Width; + availableWidth = availableSize.Width; if (!node.Left.IsNaN() && node.Right.IsNaN()) { @@ -558,7 +560,7 @@ namespace HandyControl.Controls if (node.Left.IsNaN()) { - node.Left = AvailableSize.Width - node.RightOfNode.Right; + node.Left = availableSize.Width - node.RightOfNode.Right; } } @@ -571,7 +573,7 @@ namespace HandyControl.Controls if (node.Top.IsNaN()) { - node.Top = AvailableSize.Height - node.BelowNode.Bottom; + node.Top = availableSize.Height - node.BelowNode.Bottom; } } @@ -581,8 +583,8 @@ namespace HandyControl.Controls if (node.AlignHorizontalCenterWith != null) { - var halfWidthLeft = (AvailableSize.Width + node.AlignHorizontalCenterWith.Left - node.AlignHorizontalCenterWith.Right - childSize.Width) * 0.5; - var halfWidthRight = (AvailableSize.Width - node.AlignHorizontalCenterWith.Left + node.AlignHorizontalCenterWith.Right - childSize.Width) * 0.5; + var halfWidthLeft = (availableSize.Width + node.AlignHorizontalCenterWith.Left - node.AlignHorizontalCenterWith.Right - childSize.Width) * 0.5; + var halfWidthRight = (availableSize.Width - node.AlignHorizontalCenterWith.Left + node.AlignHorizontalCenterWith.Right - childSize.Width) * 0.5; if (node.Left.IsNaN()) node.Left = halfWidthLeft; else node.Left = (node.Left + halfWidthLeft) * 0.5; @@ -593,8 +595,8 @@ namespace HandyControl.Controls if (node.AlignVerticalCenterWith != null) { - var halfHeightTop = (AvailableSize.Height + node.AlignVerticalCenterWith.Top - node.AlignVerticalCenterWith.Bottom - childSize.Height) * 0.5; - var halfHeightBottom = (AvailableSize.Height - node.AlignVerticalCenterWith.Top + node.AlignVerticalCenterWith.Bottom - childSize.Height) * 0.5; + var halfHeightTop = (availableSize.Height + node.AlignVerticalCenterWith.Top - node.AlignVerticalCenterWith.Bottom - childSize.Height) * 0.5; + var halfHeightBottom = (availableSize.Height - node.AlignVerticalCenterWith.Top + node.AlignVerticalCenterWith.Bottom - childSize.Height) * 0.5; if (node.Top.IsNaN()) node.Top = halfHeightTop; else node.Top = (node.Top + halfHeightTop) * 0.5; @@ -609,7 +611,7 @@ namespace HandyControl.Controls if (GetAlignHorizontalCenterWithPanel(child)) { - var halfSubWidth = (AvailableSize.Width - childSize.Width) * 0.5; + var halfSubWidth = (availableSize.Width - childSize.Width) * 0.5; if (node.Left.IsNaN()) node.Left = halfSubWidth; else node.Left = (node.Left + halfSubWidth) * 0.5; @@ -620,7 +622,7 @@ namespace HandyControl.Controls if (GetAlignVerticalCenterWithPanel(child)) { - var halfSubHeight = (AvailableSize.Height - childSize.Height) * 0.5; + var halfSubHeight = (availableSize.Height - childSize.Height) * 0.5; if (node.Top.IsNaN()) node.Top = halfSubHeight; else node.Top = (node.Top + halfSubHeight) * 0.5; @@ -634,37 +636,37 @@ namespace HandyControl.Controls if (node.Left.IsNaN()) { if (!node.Right.IsNaN()) - node.Left = AvailableSize.Width - node.Right - childSize.Width; + node.Left = availableSize.Width - node.Right - childSize.Width; else { node.Left = 0; - node.Right = AvailableSize.Width - childSize.Width; + node.Right = availableSize.Width - childSize.Width; } } else if (!node.Left.IsNaN() && node.Right.IsNaN()) { - node.Right = AvailableSize.Width - node.Left - childSize.Width; + node.Right = availableSize.Width - node.Left - childSize.Width; } if (node.Top.IsNaN()) { if (!node.Bottom.IsNaN()) - node.Top = AvailableSize.Height - node.Bottom - childSize.Height; + node.Top = availableSize.Height - node.Bottom - childSize.Height; else { node.Top = 0; - node.Bottom = AvailableSize.Height - childSize.Height; + node.Bottom = availableSize.Height - childSize.Height; } } else if (!node.Top.IsNaN() && node.Bottom.IsNaN()) { - node.Bottom = AvailableSize.Height - node.Top - childSize.Height; + node.Bottom = availableSize.Height - node.Top - childSize.Height; } node.Measured = true; } - public Size GetBoundingSize(bool calcWidth, bool calcHeight) + public Size GetBoundingSize(bool calcWidth, bool calcHeight, Size availableSize) { var boundingSize = new Size(); @@ -675,8 +677,8 @@ namespace HandyControl.Controls boundingSize.Height = Math.Max(boundingSize.Height, size.Height); } - boundingSize.Width = calcWidth ? boundingSize.Width : AvailableSize.Width; - boundingSize.Height = calcHeight ? boundingSize.Height : AvailableSize.Height; + boundingSize.Width = calcWidth ? Math.Max(availableSize.Width, boundingSize.Width) : availableSize.Width; + boundingSize.Height = calcHeight ? Math.Max(availableSize.Height, boundingSize.Height) : availableSize.Height; return boundingSize; } }