Como posso ser notificado de um evento de clique direito de uma caixa de listagem em C #

StackOverflow https://stackoverflow.com/questions/1828133

  •  11-09-2019
  •  | 
  •  

Pergunta

Eu estou tentando determinar se um usuário tem direito clicado em uma entrada caixa de listagem existente ou a parte vazia, para ativar ou desativar menuitems contexto.

Em WinForms (para um datagridview) eu era capaz de fazer

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

em um datagridview. Agora em WPF eu tentei

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

mostra Result.VisualHit caixa de texto se eu clicar em um texto existente, mas fronteira, se eu clicar no espaço em branco antes ou depois do texto em uma linha existente (que retornaria um falso negativo se eu usá-lo para determinar se uma entrada estava certo clicada).

Todas as ideias, tanto para Caixa de listagem e DataGrid?

Foi útil?

Solução

pls verificar o código abaixo; é um manipulador de eventos MouseRightButtonUp para um controle de caixa de listagem que imprime o nome do item sob o ponteiro do mouse se ele está lá

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;
}

este bem deve ser trabalhar para a caixa de listagem relação

Outras dicas

Se a memória serve, o evento RightClick bolhas do elemento que é realmente clicou até o elemento raiz da página. Se você anexar o manipulador de eventos para os itens se em vez da caixa de listagem, você será capaz de lidar com o clique sobre os itens individuais e impedir que ele borbulhando mais longe. Se o evento chega ao manipulador de caixa de listagem, o clique ocorreu em uma região em branco do controle.

Como alternativa, você pode tentar verificar a propriedade OriginalSource dos argumentos do evento, mas eu tive alguns problemas com isso no passado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top