簡體   English   中英

ContextMenuOpening事件沒有在WPF中觸發?

[英]ContextMenuOpening event not firing in WPF?

我有一個資源字典,里面有一個上下文菜單:

<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'的定義,並且沒有擴展方法'ContextMenu_OnContextMenuOpening'可以找到接受類型'MyApp.Components.MyContextMenu'的第一個參數(你是否缺少using指令或程序集引用?)

更新2:看起來Console.WriteLineDebug.WriteLine產生輸出,但只是“隨機”,尤其是當我點擊項目底部附近時。 某種碰撞檢測可能不起作用?

ContextMenuOpening事件必須在ContextMenu的祖先上處理,而不是在ContextMenu本身上處理。 如果您嘗試在ContextMenu上處理它,則只有在ContextMenu已經打開時右鍵單擊才會觸發事件。

這是框架中的一個錯誤: http//connect.microsoft.com/VisualStudio/feedback/details/353112/contextmenu-opening-event-doesnt-fire-properly

第一次右鍵單擊時不會觸發上下文菜單的開啟事件。 只有在不移動鼠標的情況下進行兩次連續右鍵單擊時才會觸發。

我相信kurrazyman有正確的答案,但我花了一段時間來理解它。 在我的例子中,我有一個帶有上下文菜單的TreeView控件。 使用myTreeView.ContextMenu.ContextMenuOpening不起作用,但使用myTreeView.ContextMenuOpening

我正在使用IsVisibleChanged事件:

private void ContextMenu_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    var isVisible = (bool)e.NewValue;
    if (isVisible)
    {
        //...
    }
}

它不是一個bug,它正在工作......這是大多數人用ContextMenuOpening事件做的最常見的錯誤......考慮這兩個不同的場景來找出這個問題的實際原因,

情景1(這不起作用):

<ListBox Name="lb_sizes" Height="120">
<ListBox.ContextMenu>
<ContextMenu ContextMenuOpening="My_ContextMenuOpening">
<MenuItem Header="Delete"/>
<MenuItem Header="Delete All"/>
</ContextMenu>
</ListBox.ContextMenu>
</ListBox>

情景2(這將有效):

<ListBox Name="lb_sizes" Height="120" ContextMenuOpening="My_ContextMenuOpening">
<ListBox.ContextMenu>
<ContextMenu>
<MenuItem Header="Delete"/>
<MenuItem Header="Delete All"/>
</ContextMenu>
</ListBox.ContextMenu>
</ListBox>

唯一的區別是將ContextMenuOpening事件分配給正確的元素...在場景1中它被分配(附加)到<ContextMenu>元素,而在場景2中,它被分配給<ListBox>元素,這是正確的方法,並且應該工作。

暫無
暫無

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

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