【问题标题】:WPF preventing Popup control to consume click eventWPF阻止弹出控件消耗点击事件
【发布时间】:2017-12-28 15:58:50
【问题描述】:

我有一个在情节提要完成后出现的弹出控件。此弹出窗口附加到堆栈面板并位于底部。

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

private void pnlTopMenu_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)

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

我的问题是弹出行为(点击时隐藏)与堆栈面板的 MouseLeftButtonDown 事件冲突。

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

所以它发生了以下情况。

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

【问题讨论】:

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


    【解决方案1】:

    我已经通过以下方式解决了。

    1. 为 Popup 控件设置 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);
          }
      }
      

    因此,如果用户双击堆栈面板上的任何位置,弹出窗口和堆栈面板都将被隐藏。如果用户只在 stackpanel 的任意位置单击一次,则只会隐藏 popup(当为 Popup 设置了 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 控件。

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

    【讨论】:

      猜你喜欢
      • 2012-04-26
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多