diff --git a/src/Perspex.Controls/DropDown.cs b/src/Perspex.Controls/DropDown.cs index 2616db1e01..34a845d5c3 100644 --- a/src/Perspex.Controls/DropDown.cs +++ b/src/Perspex.Controls/DropDown.cs @@ -36,6 +36,7 @@ namespace Perspex.Controls private bool _isDropDownOpen; private Popup _popup; + private bool _closing; static DropDown() { @@ -111,15 +112,14 @@ namespace Perspex.Controls protected override void OnPointerPressed(PointerPressEventArgs e) { - if (!IsDropDownOpen) + if (!IsDropDownOpen && !_closing && ((IVisual)e.Source).GetVisualRoot() != typeof(PopupRoot)) { - if (((IVisual)e.Source).GetVisualAncestors().Last().GetType() != typeof(PopupRoot)) - { - IsDropDownOpen = true; - e.Handled = true; - } + IsDropDownOpen = true; + e.Handled = true; } + _closing = false; + if (!e.Handled) { if (UpdateSelectionFromEventSource(e.Source)) @@ -140,6 +140,7 @@ namespace Perspex.Controls _popup = e.NameScope.Get("PART_Popup"); _popup.Opened += PopupOpened; + _popup.Closed += PopupClosed; } private void PopupOpened(object sender, EventArgs e) @@ -153,6 +154,11 @@ namespace Perspex.Controls } } + private void PopupClosed(object sender, EventArgs e) + { + _closing = true; + } + private void SelectedItemChanged(PerspexPropertyChangedEventArgs e) { UpdateSelectionBoxItem(e.NewValue); diff --git a/src/Perspex.Controls/Primitives/Popup.cs b/src/Perspex.Controls/Primitives/Popup.cs index c074d26874..897e3ef90a 100644 --- a/src/Perspex.Controls/Primitives/Popup.cs +++ b/src/Perspex.Controls/Primitives/Popup.cs @@ -59,6 +59,7 @@ namespace Perspex.Controls.Primitives /// static Popup() { + IsHitTestVisibleProperty.OverrideDefaultValue(false); ChildProperty.Changed.AddClassHandler(x => x.ChildChanged); IsOpenProperty.Changed.AddClassHandler(x => x.IsOpenChanged); } diff --git a/src/Perspex.Themes.Default/DropDown.paml b/src/Perspex.Themes.Default/DropDown.paml index 0c4eb6f5e6..2d65df2c29 100644 --- a/src/Perspex.Themes.Default/DropDown.paml +++ b/src/Perspex.Themes.Default/DropDown.paml @@ -20,6 +20,7 @@ Background="Transparent" ClickMode="Press" Focusable="False" + IsChecked="{TemplateBinding IsDropDownOpen, Mode=TwoWay}" Grid.Column="1">