Como posso ser notificado de um evento de clique direito de uma caixa de listagem em C #
-
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?
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.