如何在以编程方式打开上下文菜单时引发ContextMenuOpening事件
本文关键字:菜单 事件 ContextMenuOpening 上下文 编程 方式打 | 更新日期: 2023-09-27 18:07:00
当我用<control>.ContextMenu.IsOpen = true
打开上下文菜单时,上下文菜单变得可见,但没有触发打开或关闭事件。
当我以编程方式打开上下文菜单时,我如何确保ContextMenuOpening
和ContextMenuClosing
事件被引发?
演示:
看下面的XAML
<Button Name="ContextMenuButton"
Content="Click me!"
Click="ContextMenuButton_Click"
ContextMenuOpening="ContextMenuButton_OnContextMenuOpening"
ContextMenuClosing="ContextMenuButton_OnContextMenuClosing">
<Button.ContextMenu>
<ContextMenu>
<MenuItem Header="First element" />
<MenuItem Header="Second element" />
</ContextMenu>
</Button.ContextMenu>
</Button>
和后面的代码
public MainWindow() // Constructor
{
InitializeComponent();
ContextMenuButton.ContextMenuOpening += (sender, args) => Debug.Print("Opening #2");
ContextMenuButton.ContextMenuClosing += (sender, args) => Debug.Print("Closing #2");
}
private void ContextMenuButton_Click(object sender, RoutedEventArgs e)
{
Button button = (sender as Button);
button.ContextMenu.IsOpen = true; // How should I open the ContextMenu?
}
private void ContextMenuButton_OnContextMenuOpening(object sender, ContextMenuEventArgs e)
{
Debug.Print("Opening #1");
}
private void ContextMenuButton_OnContextMenuClosing(object sender, ContextMenuEventArgs e)
{
Debug.Print("Closing #1");
}
右击按钮时的行为:
上下文菜单正在打开。
输出为:
Opening #1
Opening #2
Closing #1
Closing #2
左键点击按钮时的行为:
上下文菜单正在打开。
输出为:
<Nothing>
问题是你已经在ContextMenuOpening of Button上附加了事件,并且由于你手动调用ContextMenu,事件没有触发
所以要获取事件,从ContextMenu
中附加打开和关闭事件 public MainWindow() // Constructor
{
InitializeComponent();
ContextMenuButton.ContextMenu.Opened += (sender, args) => Debug.Print("Opening #2");
ContextMenuButton.ContextMenu.Closed += (sender, args) => Debug.Print("Closing #2");
}
xaml
<Button Name="ContextMenuButton"
Content="Click me!"
Click="ContextMenuButton_Click" >
<Button.ContextMenu>
<ContextMenu Opened="ContextMenuButton_OnContextMenuOpening" Closed="ContextMenuButton_OnContextMenuClosing">
<MenuItem Header="First element" />
<MenuItem Header="Second element" />
</ContextMenu>
</Button.ContextMenu>
</Button>
events, ContextMenuEventArgs更改为RoutedEventArgs
private void ContextMenuButton_OnContextMenuOpening(object sender, RoutedEventArgs e)
{
Debug.Print("Opening #1");
}
private void ContextMenuButton_OnContextMenuClosing(object sender, RoutedEventArgs e)
{
Debug.Print("Closing #1");
}
按钮点击保持不变。
这应该能解决你的问题
open事件与open事件有区别。通常,打开事件用于在菜单显示之前动态构建菜单。以上解决方法在这种情况下不起作用。
`
// Raise Context menu Opening Event
var args = CreateInstance<ContextMenuEventArgs>(element, true);
args.RoutedEvent = FrameworkElement.ContextMenuOpeningEvent;
element.RaiseEvent(args);
contextMenu.IsOpen = true;
`