From e16444b33ec1880617ba9c33481c01564167fe38 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 3 Feb 2015 21:56:49 +0100 Subject: [PATCH] Make dropdown open with a click anywhere.... ...on its surface. --- Perspex.Controls/Button.cs | 24 +++++++++++++++++++++++- Perspex.Controls/DropDown.cs | 6 ++++++ Perspex.Controls/Popup.cs | 8 ++++++++ Perspex.Themes.Default/DropDownStyle.cs | 1 + 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/Perspex.Controls/Button.cs b/Perspex.Controls/Button.cs index 64c4b4d34f..5e31bb8298 100644 --- a/Perspex.Controls/Button.cs +++ b/Perspex.Controls/Button.cs @@ -10,8 +10,17 @@ namespace Perspex.Controls using Perspex.Input; using Perspex.Interactivity; + public enum ClickMode + { + Release, + Press, + } + public class Button : ContentControl { + public static readonly PerspexProperty ClickModeProperty = + PerspexProperty.Register("ClickMode"); + public static readonly RoutedEvent ClickEvent = RoutedEvent.Register("Click", RoutingStrategy.Bubble); @@ -26,6 +35,12 @@ namespace Perspex.Controls remove { this.RemoveHandler(ClickEvent, value); } } + public ClickMode ClickMode + { + get { return this.GetValue(ClickModeProperty); } + set { this.SetValue(ClickModeProperty, value); } + } + protected override Size MeasureOverride(Size availableSize) { return base.MeasureOverride(availableSize); @@ -46,6 +61,12 @@ namespace Perspex.Controls this.Classes.Add(":pressed"); e.Device.Capture(this); + e.Handled = true; + + if (this.ClickMode == ClickMode.Press) + { + this.RaiseClickEvent(); + } } protected override void OnPointerReleased(PointerEventArgs e) @@ -54,8 +75,9 @@ namespace Perspex.Controls e.Device.Capture(null); this.Classes.Remove(":pressed"); + e.Handled = true; - if (this.Classes.Contains(":pointerover")) + if (this.ClickMode == ClickMode.Release && this.Classes.Contains(":pointerover")) { this.RaiseClickEvent(); } diff --git a/Perspex.Controls/DropDown.cs b/Perspex.Controls/DropDown.cs index 127e1c6afe..69b7ea0da7 100644 --- a/Perspex.Controls/DropDown.cs +++ b/Perspex.Controls/DropDown.cs @@ -11,6 +11,7 @@ namespace Perspex.Controls using Perspex.Controls.Presenters; using Perspex.Controls.Primitives; using Perspex.Controls.Templates; + using Perspex.Input; using Perspex.Layout; public class DropDown : SelectingItemsControl, IContentControl, ILogical @@ -64,6 +65,11 @@ namespace Perspex.Controls get { return this.logicalChildren; } } + protected override void OnPointerPressed(PointerPressEventArgs e) + { + this.IsDropDownOpen = !this.IsDropDownOpen; + } + protected override void OnTemplateApplied() { var container = this.GetTemplateChild("container"); diff --git a/Perspex.Controls/Popup.cs b/Perspex.Controls/Popup.cs index 535e3e7849..0abf90cf30 100644 --- a/Perspex.Controls/Popup.cs +++ b/Perspex.Controls/Popup.cs @@ -7,6 +7,7 @@ namespace Perspex.Controls { using System; + using Perspex.Interactivity; using Perspex.Platform; using Perspex.Rendering; @@ -142,6 +143,13 @@ namespace Perspex.Controls { if (!this.StaysOpen) { + var routed = e as RoutedEventArgs; + + if (routed != null) + { + routed.Handled = true; + } + this.Close(); } } diff --git a/Perspex.Themes.Default/DropDownStyle.cs b/Perspex.Themes.Default/DropDownStyle.cs index e8637c2e10..01ff12a492 100644 --- a/Perspex.Themes.Default/DropDownStyle.cs +++ b/Perspex.Themes.Default/DropDownStyle.cs @@ -73,6 +73,7 @@ namespace Perspex.Themes.Default Id = "toggle", BorderThickness = 0, Background = Brushes.Transparent, + ClickMode = ClickMode.Press, Content = new Path { Id = "checkMark",