Browse Source

Make dropdown open with a click anywhere....

...on its surface.
pull/39/head
Steven Kirk 11 years ago
parent
commit
e16444b33e
  1. 24
      Perspex.Controls/Button.cs
  2. 6
      Perspex.Controls/DropDown.cs
  3. 8
      Perspex.Controls/Popup.cs
  4. 1
      Perspex.Themes.Default/DropDownStyle.cs

24
Perspex.Controls/Button.cs

@ -10,8 +10,17 @@ namespace Perspex.Controls
using Perspex.Input; using Perspex.Input;
using Perspex.Interactivity; using Perspex.Interactivity;
public enum ClickMode
{
Release,
Press,
}
public class Button : ContentControl public class Button : ContentControl
{ {
public static readonly PerspexProperty<ClickMode> ClickModeProperty =
PerspexProperty.Register<Button, ClickMode>("ClickMode");
public static readonly RoutedEvent<RoutedEventArgs> ClickEvent = public static readonly RoutedEvent<RoutedEventArgs> ClickEvent =
RoutedEvent.Register<Button, RoutedEventArgs>("Click", RoutingStrategy.Bubble); RoutedEvent.Register<Button, RoutedEventArgs>("Click", RoutingStrategy.Bubble);
@ -26,6 +35,12 @@ namespace Perspex.Controls
remove { this.RemoveHandler(ClickEvent, value); } remove { this.RemoveHandler(ClickEvent, value); }
} }
public ClickMode ClickMode
{
get { return this.GetValue(ClickModeProperty); }
set { this.SetValue(ClickModeProperty, value); }
}
protected override Size MeasureOverride(Size availableSize) protected override Size MeasureOverride(Size availableSize)
{ {
return base.MeasureOverride(availableSize); return base.MeasureOverride(availableSize);
@ -46,6 +61,12 @@ namespace Perspex.Controls
this.Classes.Add(":pressed"); this.Classes.Add(":pressed");
e.Device.Capture(this); e.Device.Capture(this);
e.Handled = true;
if (this.ClickMode == ClickMode.Press)
{
this.RaiseClickEvent();
}
} }
protected override void OnPointerReleased(PointerEventArgs e) protected override void OnPointerReleased(PointerEventArgs e)
@ -54,8 +75,9 @@ namespace Perspex.Controls
e.Device.Capture(null); e.Device.Capture(null);
this.Classes.Remove(":pressed"); this.Classes.Remove(":pressed");
e.Handled = true;
if (this.Classes.Contains(":pointerover")) if (this.ClickMode == ClickMode.Release && this.Classes.Contains(":pointerover"))
{ {
this.RaiseClickEvent(); this.RaiseClickEvent();
} }

6
Perspex.Controls/DropDown.cs

@ -11,6 +11,7 @@ namespace Perspex.Controls
using Perspex.Controls.Presenters; using Perspex.Controls.Presenters;
using Perspex.Controls.Primitives; using Perspex.Controls.Primitives;
using Perspex.Controls.Templates; using Perspex.Controls.Templates;
using Perspex.Input;
using Perspex.Layout; using Perspex.Layout;
public class DropDown : SelectingItemsControl, IContentControl, ILogical public class DropDown : SelectingItemsControl, IContentControl, ILogical
@ -64,6 +65,11 @@ namespace Perspex.Controls
get { return this.logicalChildren; } get { return this.logicalChildren; }
} }
protected override void OnPointerPressed(PointerPressEventArgs e)
{
this.IsDropDownOpen = !this.IsDropDownOpen;
}
protected override void OnTemplateApplied() protected override void OnTemplateApplied()
{ {
var container = this.GetTemplateChild<Panel>("container"); var container = this.GetTemplateChild<Panel>("container");

8
Perspex.Controls/Popup.cs

@ -7,6 +7,7 @@
namespace Perspex.Controls namespace Perspex.Controls
{ {
using System; using System;
using Perspex.Interactivity;
using Perspex.Platform; using Perspex.Platform;
using Perspex.Rendering; using Perspex.Rendering;
@ -142,6 +143,13 @@ namespace Perspex.Controls
{ {
if (!this.StaysOpen) if (!this.StaysOpen)
{ {
var routed = e as RoutedEventArgs;
if (routed != null)
{
routed.Handled = true;
}
this.Close(); this.Close();
} }
} }

1
Perspex.Themes.Default/DropDownStyle.cs

@ -73,6 +73,7 @@ namespace Perspex.Themes.Default
Id = "toggle", Id = "toggle",
BorderThickness = 0, BorderThickness = 0,
Background = Brushes.Transparent, Background = Brushes.Transparent,
ClickMode = ClickMode.Press,
Content = new Path Content = new Path
{ {
Id = "checkMark", Id = "checkMark",

Loading…
Cancel
Save