WPF阻止Popup控件使用click事件

时间:2017-07-22 17:22:59

标签: c# wpf xaml popup .net-3.5

我在故事板完成后会出现一个弹出控件。此弹出窗口附加到堆栈面板,它位于底部。

我已经实现了双击stackpanel的功能:当用户用鼠标左键双击它时,stackpanel会滑动并消失。

private void pnlTopMenu_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)

对于弹出窗口,我设置了StaysOpen =" False"因此当用户在弹出窗口外的窗口上的任何位置单击时,弹出窗口将自动隐藏。当StaysOpen属性设置为false时,这是弹出窗口的默认行为。

我的问题是弹出行为(隐藏点击)与stackpanel的MouseLeftButtonDown事件冲突。

在MouseLeftButtonDown中,我检查e.ClickCount> = 2.如果是这样,我滑动堆栈面板并隐藏它。用户单击按钮时会显示堆栈面板:故事板开始显示,故事板完成后,还会显示堆栈面板的弹出窗口。

所以它发生在以下情况。

  1. 用户单击一个按钮以启动故事板并显示堆栈面板,当故事板完成时,它会显示附加到堆栈面板底部的堆栈面板的弹出窗口。
  2. 此时显示了stackpanel和popup。现在,如果用户双击隐藏堆栈面板,当触发pnlTopMenu_MouseLeftButtonDown时,e.ClickCount> = 2不满足,因此面板未被隐藏,因为弹出窗口消耗了1次点击隐藏自己...所以这对我来说是一个问题因为双击时没有隐藏stackpanel,所以我该如何解决这个问题呢?有没有办法弹出窗口关闭而不消耗鼠标点击?

1 个答案:

答案 0 :(得分:0)

我通过以下方式解决了这个问题。

  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);
        }
    }
    
  3. 因此,如果用户双击堆栈面板上的任何位置,则会隐藏弹出窗口和堆栈面板。如果用户只在stackpanel上的任何地方进行单击,则只会隐藏弹出窗口(当StaysOpen =" False"设置为弹出窗口时相同),并且stackpanel将保持可见(不隐藏)。

    此外,为了保持弹出窗口位于窗口重新定位,移动或调整大小,我已应用下面的代码解释here。也就是说,在我的代码隐藏(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控件。

    唯一的问题是在调整大小时,当窗口最小化到一个小尺寸时,有时弹出窗口会在主窗口之外绘制。