14

リソースディクショナリがあり、その中にコンテキストメニューがあります。

<ResourceDictionary x:Class="MyApp.Components.MyContextMenu"
                    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:MyApp"
                    xmlns:components="clr-namespace:MyApp.Components">
    <ContextMenu ContextMenuOpening="OnContextMenuOpening">

リソースディクショナリXAMLには、次のコードがあります。

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

namespace MyApp.Components
{
    public partial class MyContextMenu : ResourceDictionary
    {
        public MyContextMenu()
        {
            InitializeComponent();
        }  

        void OnContextMenuOpening(object sender, ContextMenuEventArgs e)
        {
            Console.WriteLine("here i am!");
        }
    }
}

ログが表示されていません。イベントが発生しない、または適切な場所に到達しないのはなぜだろうか。このリソースディクショナリ内にコンテキストメニューをラップしたために問題が発生するのでしょうか。

更新:興味深いことに、分離コード関数を削除すると、コンパイル中にエラーが発生します。

'ContextMenu_OnContextMenuOpening'の定義が含まれておらず、タイプ'MyApp.Components.MyContextMenu'の最初の引数を受け入れる拡張メソッド'ContextMenu_OnContextMenuOpening'が見つかりませんでした(usingディレクティブまたはアセンブリ参照がありませんか?)

更新2:両方のように見え、出力Console.WriteLineDebug.WriteLine生成しますが、「ランダムに」のみ、特にアイテムの下部近くをクリックした場合にのみ発生します。ある種の衝突検出が機能していない可能性がありますか?

4

5 に答える 5

51

ContextMenuOpeningイベントは、ContextMenu自体ではなく、ContextMenuの祖先で処理する必要があります。ContextMenuで処理しようとすると、ContextMenuが既に開いているときに右クリックした場合にのみ、イベントが発生します。

于 2013-01-17T10:11:01.380 に答える
8

クラジーマンが正しい答えを持っていると信じていますが、それを理解するのに少し時間がかかりました. 私の場合、コンテキスト メニューを備えた TreeView コントロールがありました。使用myTreeView.ContextMenu.ContextMenuOpeningしても機能しませんでしたが、使用すると機能myTreeView.ContextMenuOpeningしました。

于 2013-02-21T13:28:54.123 に答える
8

これはフレームワークのバグです: http://connect.microsoft.com/VisualStudio/feedback/details/353112/contextmenu-opening-event-doesnt-fire-properly

コンテキスト メニューのオープニング イベントは、最初の右クリックでは発生しません。マウスを動かさずに 2 回連続して右クリックした場合にのみ発生します。

于 2012-05-16T17:19:39.950 に答える
1

代わりにIsVisibleChangedイベントを使用しています。

private void ContextMenu_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    var isVisible = (bool)e.NewValue;
    if (isVisible)
    {
        //...
    }
}
于 2012-10-29T14:03:32.407 に答える