From adb9ce49d268d333bfa699e7f52f0d8b6abd7352 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sat, 24 Jan 2015 13:41:20 +0100 Subject: [PATCH] Make DropDown's dropdown a ListBox. --- Perspex.Controls/Primitives/ScrollBar.cs | 2 +- .../Primitives/ScrollBarVisibility.cs | 2 +- Perspex.Controls/ScrollViewer.cs | 20 ++++++++++++------- Perspex.Layout/Layoutable.cs | 16 +++++++++++++++ Perspex.Themes.Default/DropDownStyle.cs | 2 +- 5 files changed, 32 insertions(+), 10 deletions(-) diff --git a/Perspex.Controls/Primitives/ScrollBar.cs b/Perspex.Controls/Primitives/ScrollBar.cs index 18d48b9fd9..16b0f13eb6 100644 --- a/Perspex.Controls/Primitives/ScrollBar.cs +++ b/Perspex.Controls/Primitives/ScrollBar.cs @@ -100,7 +100,7 @@ namespace Perspex.Controls.Primitives case ScrollBarVisibility.Auto: var viewportSize = this.ViewportSize; - return double.IsNaN(viewportSize) || viewportSize < this.Maximum - this.Minimum; + return !double.IsNaN(viewportSize) && viewportSize < this.Maximum - this.Minimum; default: throw new InvalidOperationException("Invalid value for ScrollBar.Visibility."); diff --git a/Perspex.Controls/Primitives/ScrollBarVisibility.cs b/Perspex.Controls/Primitives/ScrollBarVisibility.cs index 8f4c275f2f..28fe913a34 100644 --- a/Perspex.Controls/Primitives/ScrollBarVisibility.cs +++ b/Perspex.Controls/Primitives/ScrollBarVisibility.cs @@ -8,8 +8,8 @@ namespace Perspex.Controls.Primitives { public enum ScrollBarVisibility { + Auto, Visible, Hidden, - Auto, } } diff --git a/Perspex.Controls/ScrollViewer.cs b/Perspex.Controls/ScrollViewer.cs index 213aa1eb4b..d9f63a0a71 100644 --- a/Perspex.Controls/ScrollViewer.cs +++ b/Perspex.Controls/ScrollViewer.cs @@ -65,20 +65,20 @@ namespace Perspex.Controls .Select(x => new { Extent = x[0], Viewport = x[1] }); this.Bind( - HorizontalScrollBarMaximumProperty, - extentAndViewport.Select(x => Math.Max(x.Extent.Width - x.Viewport.Width, 0))); + VerticalScrollBarViewportSizeProperty, + extentAndViewport.Select(x => Max((x.Viewport.Height / x.Extent.Height) * (x.Extent.Height - x.Viewport.Height), 0))); this.Bind( HorizontalScrollBarViewportSizeProperty, - extentAndViewport.Select(x => Math.Max((x.Viewport.Width / x.Extent.Width) * (x.Extent.Width - x.Viewport.Width), 0))); + extentAndViewport.Select(x => Max((x.Viewport.Width / x.Extent.Width) * (x.Extent.Width - x.Viewport.Width), 0))); this.Bind( - VerticalScrollBarMaximumProperty, - extentAndViewport.Select(x => Math.Max(x.Extent.Height - x.Viewport.Height, 0))); + HorizontalScrollBarMaximumProperty, + extentAndViewport.Select(x => Max(x.Extent.Width - x.Viewport.Width, 0))); this.Bind( - VerticalScrollBarViewportSizeProperty, - extentAndViewport.Select(x => Math.Max((x.Viewport.Height / x.Extent.Height) * (x.Extent.Height - x.Viewport.Height), 0))); + VerticalScrollBarMaximumProperty, + extentAndViewport.Select(x => Max(x.Extent.Height - x.Viewport.Height, 0))); this.GetObservable(OffsetProperty).Subscribe(x => { @@ -139,6 +139,12 @@ namespace Perspex.Controls return (value < min) ? min : (value > max) ? max : value; } + private static double Max(double x, double y) + { + var result = Math.Max(x, y); + return double.IsNaN(result) ? 0 : Math.Round(result); + } + private static Vector CoerceOffset(PerspexObject o, Vector value) { ScrollViewer scrollViewer = o as ScrollViewer; diff --git a/Perspex.Layout/Layoutable.cs b/Perspex.Layout/Layoutable.cs index e435068f74..42bcb31d72 100644 --- a/Perspex.Layout/Layoutable.cs +++ b/Perspex.Layout/Layoutable.cs @@ -221,6 +221,14 @@ namespace Perspex.Layout { var parent = this.GetVisualParent(); + if (this.IsMeasureValid) + { + this.Log().Debug( + "Invalidated measure of {0} (#{1:x8})", + this.GetType().Name, + this.GetHashCode()); + } + this.IsMeasureValid = false; this.IsArrangeValid = false; this.previousMeasure = null; @@ -245,6 +253,14 @@ namespace Perspex.Layout { var root = this.GetLayoutRoot(); + if (this.IsArrangeValid) + { + this.Log().Debug( + "Invalidated arrange of {0} (#{1:x8})", + this.GetType().Name, + this.GetHashCode()); + } + this.IsArrangeValid = false; this.previousArrange = null; diff --git a/Perspex.Themes.Default/DropDownStyle.cs b/Perspex.Themes.Default/DropDownStyle.cs index a616094e1c..82f1deb8af 100644 --- a/Perspex.Themes.Default/DropDownStyle.cs +++ b/Perspex.Themes.Default/DropDownStyle.cs @@ -81,7 +81,7 @@ namespace Perspex.Themes.Default }, new Popup { - Child = new ItemsControl + Child = new ListBox { [~ListBox.ItemsProperty] = control[~DropDown.ItemsProperty], },