简体   繁体   English

以编程方式打开上下文菜单时如何引发 ContextMenuOpening 事件

[英]How to raise ContextMenuOpening event when opening context menu programmatically

When I open a context menu with <control>.ContextMenu.IsOpen = true , the context menu becomes visible but neither the opening or closing events are triggered.当我使用<control>.ContextMenu.IsOpen = true打开上下文菜单时,上下文菜单变得可见,但不会触发打开或关闭事件。

How can I make sure the ContextMenuOpening and ContextMenuClosing events are raised when I open a context menu programmatically?当我以编程方式打开上下文菜单时,如何确保引发ContextMenuOpeningContextMenuClosing事件?


Demo:演示:

Look at the following XAML看下面的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>

And the following code-behind以及以下代码隐藏

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");
}

Behavior when right-clicking on the button:右键单击按钮时的行为:

Context menu is opening.上下文菜单正在打开。

Output is:输出是:

Opening #1
Opening #2
Closing #1
Closing #2

Behavior when left-clicking on the button:左键单击按钮时的行为:

Context menu is opening.上下文菜单正在打开。

Output is:输出是:

<Nothing>

The Issue is that you've attached events on ContextMenuOpening of Button, and since you are invoking the ContextMenu manually the events did not fire问题是您在 Button 的 ContextMenuOpening 上附加了事件,并且由于您手动调用了 ContextMenu,因此事件没有触发

so to get the events attach the Opened and Closed event from ContextMenu所以为了让事件附加来自 ContextMenu 的 Opened 和 Closed 事件

    public MainWindow() // Constructor
    {
        InitializeComponent();
        ContextMenuButton.ContextMenu.Opened += (sender, args) => Debug.Print("Opening #2");
        ContextMenuButton.ContextMenu.Closed += (sender, args) => Debug.Print("Closing #2");
    }

xaml xml

    <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 changed to RoutedEventArgs事件,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");
    }

button click remain same.按钮点击保持不变。

this should solve your issue这应该可以解决您的问题

There is difference between Opened and Opening event. Opened 和 Opening 事件之间存在差异。 Usually Opening event is used to build the menu dynamically before menu are shown.通常 Opening 事件用于在菜单显示之前动态构建菜单。 The above solution will not work in such case.在这种情况下,上述解决方案将不起作用。

`
 // Raise Context menu Opening Event
 var args = CreateInstance<ContextMenuEventArgs>(element, true);
 args.RoutedEvent = FrameworkElement.ContextMenuOpeningEvent;
 element.RaiseEvent(args);
 
 contextMenu.IsOpen = true;
`

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

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