簡體   English   中英

如何在WPF中訂閱上下文菜單關閉事件?

[英]How do I subscribe to context menu closing event in WPF?

我嘗試了各種解決方案,例如在這里找到的解決方案,該解決方案具有以下公認的答案:

<Button ContextMenuClosing="ContextMenu_ContextMenuClosing">
    <Button.ContextMenu>
        <ContextMenu>
             <MenuItem Header="Go"/>
        </ContextMenu>
    </Button.ContextMenu>
 </Button>

但是,實現上述解決方案后,無論如何關閉,我仍然無法成功監聽ContextMenuClosing事件(進行選擇,單擊父按鈕,單擊菜單或按鈕的任意位置)。 以下是我的代碼,我在做什么錯?

TestPage.xaml

<Page x:Class="MyProject.pages.TestPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:MIMOUI.pages"
    mc:Ignorable="d"
    d:DesignHeight="300"
    d:DesignWidth="300"
    Title="TestPage">

    <Grid>
        <Button x:Name="myMenuButton" 
            Width="140" 
            Height="100" 
            Click="myMenuButton_Click"
            ContextMenuClosing="myMenuButton_ContextMenuClosing"
            Background="NavajoWhite" 
            Foreground="BurlyWood">

            <Button.ContextMenu>
                <ContextMenu x:Name="myMenuButton_ContextMenu" Width="250">
                    <MenuItem x:Name="myTaskMenuButton" Header="TASKS" />
                    <MenuItem x:Name="myTransactionButton" Header="TRANSACTION" />
                    <MenuItem x:Name="mySetupMenuButton" Header="SETUP" />
                </ContextMenu>
            </Button.ContextMenu>
        </Button>
    </Grid>
</Page>

TestPage.xaml.cs

using System;
using System.Windows;
using System.Windows.Controls;

namespace MyProject.pages {
    public partial class TestPage : Page {
        public TestPage() {
            InitializeComponent();
        }

        public void myMenuButton_Click(object sender, RoutedEventArgs e) {
            (sender as Button).ContextMenu.IsOpen = true;
        }

        public void myMenuButton_ContextMenuClosing(object sender, RoutedEventArgs e) {
            Console.WriteLine("intercepted!!!!");
            e.Handled = true;
        }
    }
}

由於我不知道的原因,當您的Click代碼打開ContextMenuClosing似乎沒有觸發它。 如果您要通過右鍵單擊打開ContextMenu ,則將按預期觸發事件。 作為一種解決方法,您可以使用ContextMenu.Closed事件,這兩種情況似乎都被調用

<Button x:Name="myMenuButton" Click="myMenuButton_Click" ...>
    <Button.ContextMenu>
        <ContextMenu ... Closed="myMenuButton_ContextMenu_Closed">
            <MenuItem x:Name="myTaskMenuButton" Header="TASKS" />
            <MenuItem x:Name="myTransactionButton" Header="TRANSACTION" />
            <MenuItem x:Name="mySetupMenuButton" Header="SETUP" />
        </ContextMenu>
    </Button.ContextMenu>
</Button>

並在您的代碼中

private void myMenuButton_ContextMenu_Closed(object sender, RoutedEventArgs e)
{
    Debug.WriteLine("myMenuButton_ContextMenu_Closed");
}

唯一的區別似乎是您無法像在ContextMenuClosing事件中一樣能夠阻止ContextMenu關閉

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM