C#에서 Listbox의 마우스 오른쪽 클릭 이벤트를 어떻게 알릴 수 있습니까?

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

  •  11-09-2019
  •  | 
  •  

문제

컨텍스트 menuitems를 활성화하거나 비활성화하기 위해 사용자가 기존 Listbox 항목 또는 빈 부분을 마우스 오른쪽 버튼으로 클릭했는지 확인하려고합니다.

Winforms (DatagridView)에서 나는 할 수 있었다

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

DataGridView에서. 이제 WPF에서 나는 시도했다

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

result.visualhit 기존 텍스트를 클릭하면 텍스트 상자가 표시되지만 기존 줄의 텍스트 전후에 빈 공간을 클릭하면 테두리가 있습니다 (항목을 마우스 오른쪽 버튼으로 클릭했는지 확인하기 위해 사용하면 잘못된 음수를 반환합니다).

Listbox와 Datagrid 모두에 대한 아이디어가 있습니까?

도움이 되었습니까?

해결책

pls 아래 코드를 확인합니다. 마우스 포인터 아래에 항목 이름을 인쇄하는 ListBox 컨트롤을위한 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;
}

이것은 Listbox Gods에 대해 잘 작동해야합니다

다른 팁

메모리가 제공되면 실제로 페이지의 루트 요소까지 클릭하는 요소의 오른쪽 클릭 이벤트 기반이 있습니다. 이벤트 핸들러를 ListBox 대신 항목 자체에 첨부하면 개별 항목의 클릭을 처리하고 더 이상 버블 링을 방지 할 수 있습니다. 이벤트가 ListBox 핸들러에 도달하면 컨트롤의 빈 영역에서 클릭이 발생했습니다.

또는 이벤트 Args의 OriginalSource 속성을 확인해 볼 수 있지만 과거에는 문제가있었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top