Как я могу получить уведомление о событии щелчка правой кнопкой мыши в списке в C # - PullRequest
0 голосов
/ 01 декабря 2009

Я пытаюсь определить, нажал ли пользователь правой кнопкой мыши на существующую запись списка или пустую часть, чтобы включить или отключить элементы контекстного меню.

В WinForms (для просмотра данных) я смог сделать

var result = DGVTasks.HitTest(e.X, e.Y);
bool existingRowSelected = result .Type == DataGridViewHitTestType.Cell;

в обзоре данных. Сейчас в WPF я пробовал

Point pt = e.GetPosition((UIElement)LBXWorkflow);
HitTestResult result = VisualTreeHelper.HitTest(LBXWorkflow, pt);

Result.VisualHit показывает текстовое поле, если я щелкаю на существующем тексте, но границу, если я нажимаю на пустое место до или после текста в существующей строке (который вернул бы ложный минус, если бы я использовал его, чтобы определить, была ли запись правильной щелкнул).

Есть идеи как для Listbox, так и для DataGrid?

Ответы [ 2 ]

1 голос
/ 02 декабря 2009

Пожалуйста, проверьте код ниже; это обработчик события MouseRightButtonUp для элемента управления списка, который печатает имя элемента под указателем мыши, если оно там

private void listBox1_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
    object item = GetElementFromPoint(listBox1, e.GetPosition(listBox1));
    if (item!=null)
        Console.WriteLine(item);
    else
        Console.WriteLine("no item found");
}

private object GetElementFromPoint(ItemsControl itemsControl, Point point)
{
    // you can use either VisualTreeHelper.HitTest or itemsControl.InputHitTest method here; both of them would work
    //UIElement element = VisualTreeHelper.HitTest(itemsControl, point).VisualHit as UIElement;
    UIElement element = itemsControl.InputHitTest(point) as UIElement;
    while (element!=null)
    {
        if (element == itemsControl)
            return null;
        object item = itemsControl.ItemContainerGenerator.ItemFromContainer(element);
        if (!item.Equals(DependencyProperty.UnsetValue))
            return item;
        element = (UIElement)VisualTreeHelper.GetParent(element);
    }
    return null;
}

это должно работать нормально для списка С уважением

0 голосов
/ 01 декабря 2009

Если память служит, событие RightClick вспыхивает от элемента, который фактически нажат до корневого элемента страницы. Если вы прикрепите обработчик событий к самим элементам, а не к ListBox, вы сможете обрабатывать щелчок по отдельным элементам и предотвращать его дальнейшее образование пузырьков. Если событие достигает обработчика ListBox, щелчок произошел в пустой области элемента управления.

В качестве альтернативы вы можете попробовать проверить свойство OriginalSource аргументов события, но у меня были некоторые проблемы с этим в прошлом.

...