Browse Source

Make dropdown close on click.

pull/39/head
Steven Kirk 11 years ago
parent
commit
8d2006c968
  1. 35
      Perspex.Controls/Popup.cs
  2. 9
      Perspex.Input/InputElement.cs
  3. 10
      Perspex.Input/MouseDevice.cs
  4. 2
      Perspex.Interactivity/Interactive.cs
  5. 3
      Perspex.Themes.Default/DropDownStyle.cs

35
Perspex.Controls/Popup.cs

@ -24,9 +24,9 @@ namespace Perspex.Controls
public static readonly PerspexProperty<bool> StaysOpenProperty = public static readonly PerspexProperty<bool> StaysOpenProperty =
PerspexProperty.Register<Popup, bool>("StaysOpen", true); PerspexProperty.Register<Popup, bool>("StaysOpen", true);
private PopupRoot root; private PopupRoot popupRoot;
private Window window; private TopLevel topLevel;
static Popup() static Popup()
{ {
@ -73,36 +73,43 @@ namespace Perspex.Controls
public void Open() public void Open()
{ {
if (this.root == null) if (this.popupRoot == null)
{ {
this.root = new PopupRoot(); this.popupRoot = new PopupRoot();
this.root.Parent = this; this.popupRoot.Parent = this;
this.root[~PopupRoot.ContentProperty] = this[~ChildProperty]; this.popupRoot[~PopupRoot.ContentProperty] = this[~ChildProperty];
this.root.Deactivated += this.RootDeactivated;
} }
this.root.SetPosition(this.GetPosition()); this.popupRoot.SetPosition(this.GetPosition());
this.root.Show(); this.popupRoot.PreviewPointerPressed += this.MaybeClose;
this.topLevel.PreviewPointerPressed += this.MaybeClose;
this.topLevel.Deactivated += this.MaybeClose;
this.popupRoot.Show();
} }
public void Close() public void Close()
{ {
if (this.root != null) if (this.popupRoot != null)
{ {
this.root.Hide(); this.popupRoot.PreviewPointerPressed -= this.MaybeClose;
this.topLevel.PreviewPointerPressed -= this.MaybeClose;
this.topLevel.Deactivated -= this.MaybeClose;
this.popupRoot.Hide();
} }
this.IsOpen = false;
} }
protected override void OnAttachedToVisualTree(IRenderRoot root) protected override void OnAttachedToVisualTree(IRenderRoot root)
{ {
base.OnAttachedToVisualTree(root); base.OnAttachedToVisualTree(root);
this.window = root as Window; this.topLevel = root as TopLevel;
} }
protected override void OnDetachedFromVisualTree(IRenderRoot oldRoot) protected override void OnDetachedFromVisualTree(IRenderRoot oldRoot)
{ {
base.OnDetachedFromVisualTree(oldRoot); base.OnDetachedFromVisualTree(oldRoot);
this.window = null; this.topLevel = null;
} }
private Point GetPosition() private Point GetPosition()
@ -117,7 +124,7 @@ namespace Perspex.Controls
} }
} }
private void RootDeactivated(object sender, EventArgs e) private void MaybeClose(object sender, EventArgs e)
{ {
if (!this.StaysOpen) if (!this.StaysOpen)
{ {

9
Perspex.Input/InputElement.cs

@ -41,6 +41,9 @@ namespace Perspex.Input
public static readonly RoutedEvent<KeyEventArgs> PreviewKeyDownEvent = public static readonly RoutedEvent<KeyEventArgs> PreviewKeyDownEvent =
RoutedEvent.Register<InputElement, KeyEventArgs>("PreviewKeyDown", RoutingStrategy.Tunnel); RoutedEvent.Register<InputElement, KeyEventArgs>("PreviewKeyDown", RoutingStrategy.Tunnel);
public static readonly RoutedEvent<PointerPressEventArgs> PreviewPointerPressedEvent =
RoutedEvent.Register<InputElement, PointerPressEventArgs>("PreviewPointerPressed", RoutingStrategy.Tunnel);
public static readonly RoutedEvent<PointerEventArgs> PointerEnterEvent = public static readonly RoutedEvent<PointerEventArgs> PointerEnterEvent =
RoutedEvent.Register<InputElement, PointerEventArgs>("PointerEnter", RoutingStrategy.Direct); RoutedEvent.Register<InputElement, PointerEventArgs>("PointerEnter", RoutingStrategy.Direct);
@ -99,6 +102,12 @@ namespace Perspex.Input
remove { this.RemoveHandler(PreviewKeyDownEvent, value); } remove { this.RemoveHandler(PreviewKeyDownEvent, value); }
} }
public event EventHandler<PointerPressEventArgs> PreviewPointerPressed
{
add { this.AddHandler(PreviewPointerPressedEvent, value); }
remove { this.RemoveHandler(PreviewPointerPressedEvent, value); }
}
public event EventHandler<PointerEventArgs> PointerEnter public event EventHandler<PointerEventArgs> PointerEnter
{ {
add { this.AddHandler(PointerEnterEvent, value); } add { this.AddHandler(PointerEnterEvent, value); }

10
Perspex.Input/MouseDevice.cs

@ -128,14 +128,18 @@ namespace Perspex.Input
this.lastClickRect = new Rect(p, new Size()) this.lastClickRect = new Rect(p, new Size())
.Inflate(new Thickness(settings.DoubleClickSize.Width / 2, settings.DoubleClickSize.Height / 2)); .Inflate(new Thickness(settings.DoubleClickSize.Width / 2, settings.DoubleClickSize.Height / 2));
source.RaiseEvent(new PointerPressEventArgs var e = new PointerPressEventArgs
{ {
Device = this, Device = this,
RoutedEvent = InputElement.PointerPressedEvent, RoutedEvent = InputElement.PreviewPointerPressedEvent,
OriginalSource = source, OriginalSource = source,
Source = source, Source = source,
ClickCount = this.clickCount, ClickCount = this.clickCount,
}); };
source.RaiseEvent(e);
e.RoutedEvent = InputElement.PointerPressedEvent;
source.RaiseEvent(e);
} }
IInputElement focusable = this.GetFocusable(hit); IInputElement focusable = this.GetFocusable(hit);

2
Perspex.Interactivity/Interactive.cs

@ -120,7 +120,7 @@ namespace Perspex.Interactivity
if (this.eventHandlers.TryGetValue(e.RoutedEvent, out delegates)) if (this.eventHandlers.TryGetValue(e.RoutedEvent, out delegates))
{ {
foreach (Delegate handler in delegates) foreach (Delegate handler in delegates.ToList())
{ {
handler.DynamicInvoke(this, e); handler.DynamicInvoke(this, e);
} }

3
Perspex.Themes.Default/DropDownStyle.cs

@ -87,7 +87,8 @@ namespace Perspex.Themes.Default
[~~ListBox.SelectedItemProperty] = control[~~DropDown.SelectedItemProperty], [~~ListBox.SelectedItemProperty] = control[~~DropDown.SelectedItemProperty],
}, },
PlacementTarget = control, PlacementTarget = control,
[~Popup.IsOpenProperty] = control[~DropDown.IsDropDownOpenProperty], StaysOpen = false,
[~~Popup.IsOpenProperty] = control[~~DropDown.IsDropDownOpenProperty],
} }
}, },
}, },

Loading…
Cancel
Save