我有一个按钮,其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
,例如它永远不会被设置。
我认为这是关于失去焦点的问题(如果我错了,请纠正我)-那么如何解决此问题并将其标记为打开,直到再次单击?
答案 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;
}
}
}