簡體   English   中英

以編程方式添加一個上下文菜單,該菜單的Click處理程序知道右鍵單擊了哪個項目

[英]Programmatically add a context menu whose Click handler knows which item was right-clicked

我正在動態生成一棵樹( TreeViewItem ),並希望向樹中的每個項目添加相同的上下文菜單。 因為所有上下文菜單都是相同的,所以我想可以制作一個並將其應用於每個TreeViewItem (也許這是個壞主意?)只要Click處理程序可以弄清楚哪個TreeViewItem的上下文菜單已打開,這種方法就應該起作用。

我嘗試從此處 (獲取右鍵單擊的對象)和此處 (以編程方式添加綁定)組合SO答案,並提出了以下解決方案:

ContextMenu carContextMenu;

public MainWindow()
{
    InitializeComponent();
    Initialize();
    ConstructTree();
}

void ConstructTree()
{
    string[] carNames = {"Mustang", "Viper", "Jetta"};

    foreach (string car in carNames)
    {
        TreeViewItem carNode = new TreeViewItem();
        carNode.Header = car;
        carNode.ContextMenu = carContextMenu;

        CarTree.Items.Add(carNode);
    }
}

void Initialize()
{
    carContextMenu= new ContextMenu();
    MenuItem newQuery = new MenuItem();
    newQuery.Header = "Drive car...";

    Binding b = new Binding("Parent");
    b.RelativeSource = RelativeSource.Self;

    newQuery.SetBinding(MenuItem.CommandParameterProperty, b);
    newQuery.Click += NewQuery_Click;

    carContextMenu.Items.Add(newQuery);
}

void NewQuery_Click(object sender, RoutedEventArgs e)
{
    MenuItem mi = sender as MenuItem;
    if (mi != null)
    {
        ContextMenu cm = mi.CommandParameter as ContextMenu; // *****
        if (cm != null)
        {
            TreeViewItem node = cm.PlacementTarget as TreeViewItem;
            if (node != null)
            {
                Console.WriteLine(node.Header); // car name, ideally
            }
        }
    }
}

在運行時,當到達帶星號的行時, mi.CommandParameter為null,因此它將跳過該方法的其余部分。 我的方法是怎么回事? 老實說,考慮到您想知道被單擊的次數,右鍵單擊的項目不是事件處理程序參數的固有部分,我感到有些驚訝。 右鍵單擊時不需要選擇樹項,因此檢查這不是一種可靠的方法...此外,這只是一個棘手的解決方法。

謝謝!

自然地,事實證明我使事情變得過於復雜,並且我所關注的鏈接要么不正確,已過時,要么(很可能)我誤解了他們的部分情況,並且有些事情實際上不適用於我。

我不需要對MenuItem本身進行任何綁定,而應該一直都在查看myMenuItem.Parent.PlacementTarget 下面的工作代碼:

void Initialize()
{
    carContextMenu= new ContextMenu();
    MenuItem newQuery = new MenuItem();
    newQuery.Header = "Drive car...";

    newQuery.Click += NewQuery_Click;

    carContextMenu.Items.Add(newQuery);
}

void NewQuery_Click(object sender, RoutedEventArgs e)
{
    MenuItem mi = sender as MenuItem;
    if (mi != null)
    {
        ContextMenu cm = mi.Parent as ContextMenu;
        if (cm != null)
        {
            TreeViewItem node = cm.PlacementTarget as TreeViewItem;
            if (node != null)
            {
                Console.WriteLine(node.Header);
            }
        }
    }
}  

暫無
暫無

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

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