簡體   English   中英

以編程方式打開上下文菜單時如何引發 ContextMenuOpening 事件

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

當我使用<control>.ContextMenu.IsOpen = true打開上下文菜單時,上下文菜單變得可見,但不會觸發打開或關閉事件。

當我以編程方式打開上下文菜單時,如何確保引發ContextMenuOpeningContextMenuClosing事件?


演示:

看下面的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>

問題是您在 Button 的 ContextMenuOpening 上附加了事件,並且由於您手動調用了 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");
    }

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>

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

按鈕點擊保持不變。

這應該可以解決您的問題

Opened 和 Opening 事件之間存在差異。 通常 Opening 事件用於在菜單顯示之前動態構建菜單。 在這種情況下,上述解決方案將不起作用。

`
 // 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