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 =
PerspexProperty.Register<Popup, bool>("StaysOpen", true);
private PopupRoot root;
private PopupRoot popupRoot;
private Window window;
private TopLevel topLevel;
static Popup()
{
@ -73,36 +73,43 @@ namespace Perspex.Controls
public void Open()
{
if (this.root == null)
if (this.popupRoot == null)
{
this.root = new PopupRoot();
this.root.Parent = this;
this.root[~PopupRoot.ContentProperty] = this[~ChildProperty];
this.root.Deactivated += this.RootDeactivated;
this.popupRoot = new PopupRoot();
this.popupRoot.Parent = this;
this.popupRoot[~PopupRoot.ContentProperty] = this[~ChildProperty];
}
this.root.SetPosition(this.GetPosition());
this.root.Show();
this.popupRoot.SetPosition(this.GetPosition());
this.popupRoot.PreviewPointerPressed += this.MaybeClose;
this.topLevel.PreviewPointerPressed += this.MaybeClose;
this.topLevel.Deactivated += this.MaybeClose;
this.popupRoot.Show();
}
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)
{
base.OnAttachedToVisualTree(root);
this.window = root as Window;
this.topLevel = root as TopLevel;
}
protected override void OnDetachedFromVisualTree(IRenderRoot oldRoot)
{
base.OnDetachedFromVisualTree(oldRoot);
this.window = null;
this.topLevel = null;
}
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)
{

9
Perspex.Input/InputElement.cs

@ -41,6 +41,9 @@ namespace Perspex.Input
public static readonly RoutedEvent<KeyEventArgs> PreviewKeyDownEvent =
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 =
RoutedEvent.Register<InputElement, PointerEventArgs>("PointerEnter", RoutingStrategy.Direct);
@ -99,6 +102,12 @@ namespace Perspex.Input
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
{
add { this.AddHandler(PointerEnterEvent, value); }

10
Perspex.Input/MouseDevice.cs

@ -128,14 +128,18 @@ namespace Perspex.Input
this.lastClickRect = new Rect(p, new Size())
.Inflate(new Thickness(settings.DoubleClickSize.Width / 2, settings.DoubleClickSize.Height / 2));
source.RaiseEvent(new PointerPressEventArgs
var e = new PointerPressEventArgs
{
Device = this,
RoutedEvent = InputElement.PointerPressedEvent,
RoutedEvent = InputElement.PreviewPointerPressedEvent,
OriginalSource = source,
Source = source,
ClickCount = this.clickCount,
});
};
source.RaiseEvent(e);
e.RoutedEvent = InputElement.PointerPressedEvent;
source.RaiseEvent(e);
}
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))
{
foreach (Delegate handler in delegates)
foreach (Delegate handler in delegates.ToList())
{
handler.DynamicInvoke(this, e);
}

3
Perspex.Themes.Default/DropDownStyle.cs

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

Loading…
Cancel
Save