2016-03-25 22 views
0

私は、次の受け入れ答えを持っている、hereを発見したもののような様々なソリューションを、しようとしていますWPFでコンテキストメニューの終了イベントを購読するにはどうすればよいですか?

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

しかし、上記のソリューションを導入した後、私はまだ、のContextMenuClosingイベントに失敗しリスニングされていますどのように閉じているか(選択、親ボタンをクリック、メニューまたはボタンのどこかをクリックする)。以下は私のコードですが、何が間違っていますか? 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; 
     } 
    } 
} 

答えて

2

は、それがあなたのClickコードによって開かれたときにトリガされていないようです。あなたのボタンを右クリックしてContextMenuを開くと、予定通りにイベントがトリガーされます。回避策としては、両方のケースで

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

と呼ばれているように見えるContextMenu.Closedイベントを使用することができます唯一の違いは、あなたと同じように、あなたが決算からContextMenuを止めることはできないということのようです可能な限りContextMenuClosingイベント

+0

私はコンソールの代わりにMessageBox()を使用して同じ結果を得ました。あなたが正しい解決策を見つけたようです。よろしくお願いいたします –

+0

ありがとうございます!残念なことに、私は自分の問題の大部分について言及することを忘れていました。私は閉会のイベントを傍受し、起きるのを止める必要があるので、私はe.Handledを真に設定しているのです。おそらく、閉鎖されたイベントでは、私はコンテキストメニューを単に開くことができるので、イベントをキャプチャしても私は戦いの半分を勝ち取っています。 –

関連する問題