ContextMenu IsOpen属性始终为false

时间:2019-03-25 15:15:06

标签: c# wpf contextmenu

我有一个按钮,其delete[] persons; 设置如下:

ContextMenu

后面的代码:

<Button
    x:Name="TestButton"
    Click="TestButton_Click">
    <Button.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Sample Menu Item 1" />
            <MenuItem Header="Sample Menu Item 2" />
            <MenuItem Header="Sample Menu Item 3" />
        </ContextMenu>
    </Button.ContextMenu>
</Button>

因此,我将private void TestButton_Click(object sender, RoutedEventArgs e) { // This always prints false, even though the contextmenu is currently opened System.Console.WriteLine(button.ContextMenu.IsOpen); if (sender is Button button) { button.ContextMenu.Placement = PlacementMode.Bottom; button.ContextMenu.PlacementTarget = button; button.ContextMenu.StaysOpen = true; button.ContextMenu.IsOpen = !button.ContextMenu.IsOpen; // Doesn't work! } } 设置为单击一次即可打开,并且可以使用,但是我想在每次单击按钮时切换ContextMenu的可见性。为此,我想使用ContextMenu属性-如果当前值为true,则将其设置为false,反之亦然。

我的问题是,即使在第一次单击时将IsOpen属性值从IsOpen设置为false,但在第二次单击时它始终保持true,例如它永远不会被设置。

我认为这是关于失去焦点的问题(如果我错了,请纠正我)-那么如何解决此问题并将其标记为打开,直到再次单击?

3 个答案:

答案 0 :(得分:1)

  

我认为这与失去焦点有关...

是的,ContextMenu的{​​{1}}属性无法正常工作。当您单击StaysOpen时,Button实际上已关闭。

您可以通过使用ContextMenu来跟踪DependencyPropertyDescriptor何时关闭,然后在事件处理程序中将经过的时间与某个恒定值进行比较,来解决此问题。这应该起作用:

ContextMenu

答案 1 :(得分:0)

一种实现所需目标的方法是将值保留在属性/属性中:

public bool IsOpen { get; set; }

private void TestButton_Click(object sender, RoutedEventArgs e)
{
  if (sender is Button button)
  {
     button.ContextMenu.Placement = PlacementMode.Bottom;
     button.ContextMenu.PlacementTarget = button;
     IsOpen = !IsOpen;
     button.ContextMenu.IsOpen = IsOpen;
   }
      Debug.WriteLine(IsOpen);
}

答案 2 :(得分:0)

尝试一下。

private bool _isOpen = false;

private void TestButton_Click(object sender, RoutedEventArgs e)
{
    // This always prints false, even though the contextmenu is currently opened
    //System.Console.WriteLine(button.ContextMenu.IsOpen);

    if (sender is Button button)
    {
        if (_isOpen)
        {
            button.ContextMenu.IsOpen = false;
            _isOpen = false;
        }
        else
        {
            button.ContextMenu.Placement = PlacementMode.Bottom;
            button.ContextMenu.PlacementTarget = button;
            button.ContextMenu.StaysOpen = true;
            _isOpen = true;
            button.ContextMenu.IsOpen = _isOpen;
        }
    }
}