[英]WPF preventing Popup control to consume click event
我有一个演示图板完成后出现的弹出控件。 此弹出窗口将附加到堆栈面板,并位于底部。
我实现了双击堆栈面板的功能:当用户用鼠标左键双击它时,堆栈面板滑动并消失。
private void pnlTopMenu_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
对于弹出窗口,我设置了StaysOpen =“ False”,因此,当用户在弹出窗口之外的任何位置单击鼠标时,弹出窗口将自动隐藏。 当StaysOpen属性设置为false时,这是弹出窗口的默认行为。
我的问题是弹出行为(单击隐藏)与StackPanel的MouseLeftButtonDown事件发生冲突。
在MouseLeftButtonDown中,我检查e.ClickCount> =2。如果是,则滑动堆栈面板并将其隐藏。 当用户单击按钮时,将显示堆栈面板:情节提要板开始并显示它,在情节提要表完成后,还将显示该堆栈面板的弹出窗口。
因此发生以下情况。
我已经通过执行以下操作解决了它。
在pnlTopMenu_MouseLeftButtonDown中,我执行以下操作:
private void pnlTopMenu_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (e.ClickCount == 1) { // I manually close Popup control, so both Popup and stackpanel will be closed on mouse left button down double click this.MyPopup.IsOpen = false; } else if (e.ClickCount >= 2) { // Story board that starts and hide the stackpanel on double click. Storyboard sb = Resources["sbHideTopMenu"] as Storyboard; sb.Begin(pnlTopMenu); } }
因此,如果用户双击堆栈面板上的任意位置,则弹出窗口和堆栈面板都将被隐藏。 如果用户仅在堆栈面板上的任何位置单击一次,则只会隐藏弹出窗口(等效于Popup设置为StaysOpen =“ False”),并且堆栈面板将保持可见(不隐藏)。
此外,为了保持弹出窗口在重新定位,移动或调整窗口大小时的位置,我在此处解释了以下代码。 也就是说,在我的代码隐藏(xaml.cs)中,我执行以下操作:
DependencyObject myPopupPlacementTarget = this.MyPopup.PlacementTarget;
Popup myPopup = this.MyPopup;
Window w = Window.GetWindow(myPopupPlacementTarget);
if (null != w)
{
w.LocationChanged += delegate (object sender, EventArgs args)
{
var offset = myPopup.HorizontalOffset;
myPopup.HorizontalOffset = offset + 1;
myPopup.HorizontalOffset = offset;
};
w.SizeChanged += delegate (object sender, SizeChangedEventArgs args)
{
var offset = myPopup.HorizontalOffset;
myPopup.HorizontalOffset = offset + 1;
myPopup.HorizontalOffset = offset;
};
}
其中MyPopup是xaml视图中的Popup控件。
唯一的问题是调整大小时,当窗口最小化到很小的大小时,有时会在主窗口外部绘制弹出窗口。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.