Создание контекстного меню при перетаскивании в WPF - PullRequest
2 голосов
/ 26 ноября 2010

Я работаю над представлением графа узла, похожим на HyperGraph от Maya, в котором я могу подключать узлы с помощью перетаскивания.Поскольку целевой узел может иметь несколько входов, я хочу создать временное ContextMenu для выбора входа, как предлагаемого в следующем макете:

http://www.pixtur.org/images/uploaded/0000/0696/large.jpg

Я пыталсяна некоторое время, чтобы вызвать создание или открытие контекстного меню.Похоже, что Win32 TrackPopupMenu делает примерно то, что я ищу.Есть ли эквивалент WPF / C #?

Спасибо pixtur

Ответы [ 2 ]

2 голосов
/ 08 января 2011

Я бы предложил другое решение:

В этом примере кнопка вызовет контекстное меню с одним элементом («Копировать») при щелчке правой кнопкой мыши.Если щелкнуть по элементу контекстного меню «Копировать», создается консольный вывод.

[..]
var button = new Button();
button.Content = "SomeButtonName";
button.MouseUp += HandleMouseUp;
[..]


private void HandleMouseUp(object sender, MouseButtonEventArgs e)
{
    var senderUIControl = sender as Control;

    var contextMenu = new ContextMenu();

    var item = new MenuItem();
    item.Header = "Copy";
    item.Click += (o, a) => {
        Console.WriteLine("Copy item clicked");
    };
    contextMenu.Items.Add(item);

    senderUIControl.ContextMenu = contextMenu;
}
0 голосов
/ 26 ноября 2010

Я использую следующий код для присоединения контекстного меню к заголовку gricolumn вида списка:

<ListView ... MouseUp="ListView_MouseUp">

В codebehind я устанавливаю свойство ContextMenu списка для события мыши, чтобы показать контекстное меню:

    private void ListView_MouseUp(object sender, MouseButtonEventArgs e)
    {
        DependencyObject depObj = e.OriginalSource as DependencyObject;

        while (depObj != null && (!(depObj is GridViewColumnHeader)))
        {
            depObj = VisualTreeHelper.GetParent(depObj);
        }            

        if (depObj is GridViewColumnHeader && e.ChangedButton == MouseButton.Left)
        {
            ((GridViewColumnHeader)depObj).ContextMenu = ContextMenu;
        }
    }

Переменная ContextMenu ссылается на экземпляр contextmenu, который я создал bfeorehand, вы также можете создать ContextMenu в обработчике события Mouse. Я не уверен, поможет ли это, поскольку я не знаю, как вы выполняете перетаскивание, но стоит попробовать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...