繁体   English   中英

WPF防止Popup控件消耗点击事件

[英]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。如果是,则滑动堆栈面板并将其隐藏。 当用户单击按钮时,将显示堆栈面板:情节提要板开始并显示它,在情节提要表完成后,还将显示该堆栈面板的弹出窗口。

因此发生以下情况。

  1. 用户单击一个按钮,情节提要板就会开始,并显示堆栈面板,情节提要表完成时,它会显示附加到堆栈面板底部的堆栈面板的弹出窗口。
  2. 此时将显示stackpanel和弹出窗口。 现在,如果用户双击以隐藏堆栈面板,则在触发pnlTopMenu_MouseLeftButtonDown时,e.ClickCount> = 2不满足,因此面板没有被隐藏,因为弹出窗口消耗了1次单击以隐藏自身...所以这对我来说是个问题双击不会隐藏stackpanel,那么我该如何解决? 有什么方法可以关闭弹出窗口而不用点击鼠标?

我已经通过执行以下操作解决了它。

  1. 设置StaysOpen =“ True”用于弹出控件
  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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM