From b3c3173c46eaf6bacd5f01e9154628dcd2c8d3cd Mon Sep 17 00:00:00 2001 From: NaBian <836904362@qq.com> Date: Wed, 30 Jan 2019 13:50:59 +0800 Subject: [PATCH] improve the CoverView add ItemContentHeightFixedProperty for CoverView --- .../Controls/Cover/CoverView/CoverView.cs | 36 +++++++++++++++---- .../Cover/CoverView/CoverViewContent.cs | 32 ++++++++++++++--- HandyControl/Tools/Helper/ValidateHelper.cs | 28 +++++++++++++-- 3 files changed, 83 insertions(+), 13 deletions(-) diff --git a/HandyControl/Controls/Cover/CoverView/CoverView.cs b/HandyControl/Controls/Cover/CoverView/CoverView.cs index 862eb11f..38741cc8 100644 --- a/HandyControl/Controls/Cover/CoverView/CoverView.cs +++ b/HandyControl/Controls/Cover/CoverView/CoverView.cs @@ -1,6 +1,7 @@ using System.Windows; using System.Windows.Data; using HandyControl.Data; +using HandyControl.Tools; namespace HandyControl.Controls { @@ -12,9 +13,10 @@ namespace HandyControl.Controls public CoverView() { - _viewContent = new CoverViewContent {ContentHeight = ItemContentHeight}; + _viewContent = new CoverViewContent(); AddHandler(SelectableItem.SelectedEvent, new RoutedEventHandler(CoverViewItem_OnSelected)); + _viewContent.SetBinding(CoverViewContent.ContentHeightProperty, new Binding(ItemContentHeightProperty.Name) { Source = this }); _viewContent.SetBinding(WidthProperty, new Binding(ActualWidthProperty.Name) { Source = this }); } @@ -35,7 +37,7 @@ namespace HandyControl.Controls return; } - if(!Equals(_selectedItem, item)) + if (!Equals(_selectedItem, item)) { _selectedItem.IsSelected = false; item.IsSelected = true; @@ -83,12 +85,14 @@ namespace HandyControl.Controls public Style CoverViewContentStyle { - get => (Style) GetValue(CoverViewContentStyleProperty); + get => (Style)GetValue(CoverViewContentStyleProperty); set => SetValue(CoverViewContentStyleProperty, value); } internal static readonly DependencyProperty GroupsProperty = DependencyProperty.Register( - "Groups", typeof(int), typeof(CoverView), new FrameworkPropertyMetadata(ValueBoxes.Int5Box, FrameworkPropertyMetadataOptions.AffectsMeasure, OnGroupsChanged), IsGroupsValid); + "Groups", typeof(int), typeof(CoverView), + new FrameworkPropertyMetadata(ValueBoxes.Int5Box, FrameworkPropertyMetadataOptions.AffectsMeasure, + OnGroupsChanged), IsGroupsValid); internal static void OnGroupsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { @@ -111,14 +115,24 @@ namespace HandyControl.Controls } public static readonly DependencyProperty ItemContentHeightProperty = DependencyProperty.Register( - "ItemContentHeight", typeof(double), typeof(CoverView), new PropertyMetadata(ValueBoxes.Double300Box)); + "ItemContentHeight", typeof(double), typeof(CoverView), new PropertyMetadata(ValueBoxes.Double300Box), + value => ValidateHelper.IsInRangeOfPosDouble(value, true)); public double ItemContentHeight { - get => (double) GetValue(ItemContentHeightProperty); + get => (double)GetValue(ItemContentHeightProperty); set => SetValue(ItemContentHeightProperty, value); } + public static readonly DependencyProperty ItemContentHeightFixedProperty = DependencyProperty.Register( + "ItemContentHeightFixed", typeof(bool), typeof(CoverView), new PropertyMetadata(ValueBoxes.TrueBox)); + + public bool ItemContentHeightFixed + { + get => (bool)GetValue(ItemContentHeightFixedProperty); + set => SetValue(ItemContentHeightFixedProperty, value); + } + protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo) { base.OnRenderSizeChanged(sizeInfo); @@ -163,6 +177,16 @@ namespace HandyControl.Controls ItemsHost.Children.Remove(_viewContent); + if (!ItemContentHeightFixed) + { + _viewContent.ManualHeight = 0; + if (_viewContent.Content is FrameworkElement element) + { + element.Arrange(new Rect(new Size(double.MaxValue, double.MaxValue))); + _viewContent.ManualHeight = element.ActualHeight; + } + } + var total = Items.Count + 1; var totalRow = total / Groups + (total % Groups > 0 ? 1 : 0); if (total <= Groups) diff --git a/HandyControl/Controls/Cover/CoverView/CoverViewContent.cs b/HandyControl/Controls/Cover/CoverView/CoverViewContent.cs index 18d70400..dfe26dde 100644 --- a/HandyControl/Controls/Cover/CoverView/CoverViewContent.cs +++ b/HandyControl/Controls/Cover/CoverView/CoverViewContent.cs @@ -1,6 +1,7 @@ using System.Windows; using System.Windows.Controls; using HandyControl.Data; +using HandyControl.Expression.Drawing; using HandyControl.Tools; using HandyControl.Tools.Extension; @@ -26,10 +27,10 @@ namespace HandyControl.Controls private double _itemWidth; - private bool _isOpen; - internal bool CanSwitch { get; set; } = true; + private bool _isOpen; + internal bool IsOpen { get => _isOpen; @@ -41,12 +42,22 @@ namespace HandyControl.Controls } } + internal static readonly DependencyProperty ManualHeightProperty = DependencyProperty.Register( + "ManualHeight", typeof(double), typeof(CoverViewContent), new PropertyMetadata(default(double)), value => ValidateHelper.IsInRangeOfPosDouble(value, true)); + + internal double ManualHeight + { + get => (double)GetValue(ManualHeightProperty); + set => SetValue(ManualHeightProperty, value); + } + public static readonly DependencyProperty ContentHeightProperty = DependencyProperty.Register( - "ContentHeight", typeof(double), typeof(CoverViewContent), new PropertyMetadata(ValueBoxes.Double300Box)); + "ContentHeight", typeof(double), typeof(CoverViewContent), new PropertyMetadata(ValueBoxes.Double300Box), + value => ValidateHelper.IsInRangeOfPosDouble(value, true)); public double ContentHeight { - get => (double) GetValue(ContentHeightProperty); + get => (double)GetValue(ContentHeightProperty); set => SetValue(ContentHeightProperty, value); } @@ -76,12 +87,23 @@ namespace HandyControl.Controls return; } _triangle.BeginAnimation(MarginProperty, AnimationHelper.CreateAnimation(new Thickness((index % groups + .5) * itemWidth - _triangle.Width / 2, 0, 0, 0))); + if (IsOpen) + { + if (ManualHeight > 0 && !MathHelper.AreClose(ManualHeight, ContentHeight)) + { + _content.BeginAnimation(HeightProperty, AnimationHelper.CreateAnimation(ManualHeight)); + } + else + { + _content.BeginAnimation(HeightProperty, AnimationHelper.CreateAnimation(ContentHeight)); + } + } } private void OpenSwitch(bool isOpen) { if (_content == null) return; - var animation = AnimationHelper.CreateAnimation(isOpen ? ContentHeight : 0); + var animation = AnimationHelper.CreateAnimation(isOpen ? ManualHeight > 0 ? ManualHeight : ContentHeight : 0); _triangle.Show(false); this.Show(true); animation.Completed += (s, e) => diff --git a/HandyControl/Tools/Helper/ValidateHelper.cs b/HandyControl/Tools/Helper/ValidateHelper.cs index fcff6392..4a0a94a6 100644 --- a/HandyControl/Tools/Helper/ValidateHelper.cs +++ b/HandyControl/Tools/Helper/ValidateHelper.cs @@ -3,17 +3,41 @@ /// /// 验证帮助类 /// - internal class ValidateHelper + public class ValidateHelper { /// /// 是否在浮点数范围内 /// /// /// - internal static bool IsInRangeOfDouble(object value) + public static bool IsInRangeOfDouble(object value) { var v = (double)value; return !(double.IsNaN(v) || double.IsInfinity(v)); } + + /// + /// 是否在正浮点数范围内 + /// + /// + /// + /// + public static bool IsInRangeOfPosDouble(object value, bool includeZero = false) + { + var v = (double)value; + return !(double.IsNaN(v) || double.IsInfinity(v)) && (includeZero ? v >= 0 : v > 0); + } + + /// + /// 是否在正浮点数范围内 + /// + /// + /// + /// + public static bool IsInRangeOfNegDouble(object value, bool includeZero = false) + { + var v = (double)value; + return !(double.IsNaN(v) || double.IsInfinity(v)) && (includeZero ? v <= 0 : v < 0); + } } } \ No newline at end of file