繁体   English   中英

WPF左键单击ContextMenu在第二次单击时不会消失

[英]WPF left-click ContextMenu doesn't dissaepear on second click

我为WPF按钮实现了一种新行为,以通过单击鼠标左键使用上下文菜单:

public class LeftClickContextMenuButtonBehavior : Behavior<Button>
{
    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.AddHandler(UIElement.MouseDownEvent, new RoutedEventHandler(AssociatedObject_MouseDown), true);
    }

    void AssociatedObject_MouseDown(object sender, RoutedEventArgs e)
    {
        Button source = sender as Button;
        if (source != null && source.ContextMenu != null)
        {
            source.ContextMenu.PlacementTarget = source;
            source.ContextMenu.Placement = PlacementMode.Bottom;
            source.ContextMenu.IsOpen = !source.ContextMenu.IsOpen;
        }
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.RemoveHandler(UIElement.MouseDownEvent, new RoutedEventHandler(AssociatedObject_MouseDown));
    }
}

XAML:

<Button Content="Left ContextMenu test">
    <i:Interaction.Behaviors>
        <extensions:LeftClickContextMenuButtonBehavior />
    </i:Interaction.Behaviors>
    <Button.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Item A" />
            <MenuItem Header="Item B" /> 
        </ContextMenu>
    </Button.ContextMenu>
</Button>

它工作正常,但我有一个小问题-再次单击按钮(在上下文菜单仍处于打开状态),菜单关闭并立即重新打开,但是预期的行为是关闭菜单source.ContextMenu.IsOpen = !source.ContextMenu.IsOpen; 因此,似乎在触发MoseDown on按钮之前,其他一些功能会关闭菜单。 如何避免呢?

我想我已经找到了解决方案:

<Button Content="Left ContextMenu test" IsHitTestVisible="{Binding ElementName=cm, Path=IsOpen, Mode=OneWay, Converter={StaticResource BoolInverter}}">
    <i:Interaction.Behaviors>
        <extensions:LeftClickContextMenuButtonBehavior />
    </i:Interaction.Behaviors>
    <Button.ContextMenu>
        <ContextMenu x:Name="cm">
            <MenuItem Header="Item A" />
            <MenuItem Header="Item B" /> 
        </ContextMenu>
    </Button.ContextMenu>
</Button>

其中BoolInverterConverter定义为:

 public class BoolInverter : IValueConverter
 {
   public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
     {
       if (value is bool)
         return !(bool)value;
       return value;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
      throw new NotImplementedException();
    }
  }

这样,当您第二次单击该按钮时,不会被单击,但是上下文菜单将关闭,因为它失去了焦点。

尝试这个:

void AssociatedObject_MouseDown(object sender, RoutedEventArgs e)
{
    e.handled = true;  // handle the event
    Button source = sender as Button;

    //rest of the code ...
}

祝你好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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