【问题标题】:How to recognize double clicks when closing WPF context menu关闭WPF上下文菜单时如何识别双击
【发布时间】:2017-02-15 10:34:26
【问题描述】:

这是一个突出问题的示例:

<TextBlock Text="double click me" Width="150" Height="25"
           ContextMenuOpening="TextBlock_ContextMenuOpening"
           Mouse.MouseDown="TextBlock_MouseDown">
    <TextBlock.ContextMenu>
        <ContextMenu>
            <MenuItem Header="test" />
        </ContextMenu>
    </TextBlock.ContextMenu>
</TextBlock>

当上下文菜单打开时,我双击 TextBlock。 TextBlock_MouseDown 的第一个命中有 e.ClickCount = 1,正如预期的那样,但第二个也是。有什么方法可以让点击成为同一个链的一部分?

【问题讨论】:

    标签: wpf events click contextmenu double-click


    【解决方案1】:

    第一次点击关闭ContextMenu,因此您应该能够处理ContextMenuClosing,然后比较关闭ContextMenu与再次点击TextBlock之间的总时间,例如:

    DateTime dt;
    private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e)
    {
        if (DateTime.Now.Subtract(dt).TotalSeconds <= 0.3)
        {
            MessageBox.Show("double click detected!");
            dt = DateTime.MinValue;
        }
    }
    
    private void TextBlock_ContextMenuClosing(object sender, ContextMenuEventArgs e)
    {
        dt = DateTime.Now;
    }
    

    <TextBlock Text="double click me" Width="150" Height="25"
               ContextMenuClosing="TextBlock_ContextMenuClosing"
               Mouse.MouseDown="TextBlock_MouseDown">
        <TextBlock.ContextMenu>
            <ContextMenu>
                <MenuItem Header="test" />
            </ContextMenu>
        </TextBlock.ContextMenu>
    </TextBlock>
    

    【讨论】:

      【解决方案2】:

      如何使用 StaysOpenOnClick="True"。双击后关闭即可:

          <TextBlock Text="double click me" Width="150" Height="25" >
              <TextBlock.ContextMenu>
                  <ContextMenu Name="cm">
                      <MenuItem PreviewMouseDoubleClick="MenuItem_PreviewMouseDoubleClick" Header="test" 
                            StaysOpenOnClick="True" />
                  </ContextMenu>
              </TextBlock.ContextMenu>
          </TextBlock>
      

      在代码中:

          private void MenuItem_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
          {
              // ...
              cm.IsOpen = false;
          }
      

      另外请注意,ContextMenu 中也有一个 StaysOpen 属性,您可以使用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-13
        • 2014-10-27
        • 2011-05-17
        • 1970-01-01
        • 2011-07-12
        • 1970-01-01
        相关资源
        最近更新 更多