Frage

Ich versuche, um zu bestimmen, ob ein Benutzerrecht hat auf einem vorhandenen Listbox-Eintrag oder den leeren Teil geklickt hat, zu aktivieren oder zu deaktivieren Kontext menuitems.

In WinForms (für ein Datagridview) ich in der Lage war zu tun

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

in einem Datagridview. Jetzt in WPF Ich habe versucht,

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

Result.VisualHit zeigt Textbox, wenn ich auf den bestehenden Text klicken, aber Grenze, wenn ich auf Leerzeichen klicken, bevor oder nachdem der Text auf einer vorhandenen Linie (was ein falsch negatives zurückkehren würde, wenn ich es verwenden, um zu bestimmen, ob ein Eintrag richtig war geklickt haben).

Alle Ideen, für beide Listbox und Datagrid?

War es hilfreich?

Lösung

Bitte überprüfen Sie den Code unten; es ist ein MouseRightButtonUp Event-Handler für ein Steuerelement List-Box, die den Namen des Elements unter dem Mauszeiger druckt, wenn es da ist

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

Dies sollte adaequat für die listbox Grüße

Andere Tipps

Wenn der Speicher dient, bläst das Rechtsklick-Ereignis von dem Elemente, das tatsächlich angeklickt wird, um das Wurzelelement der Seite nach oben. Wenn Sie die Event-Handler zu den Einzelteilen selbst anstelle der List-Box anschließen, können Sie den Klick auf den einzelnen Positionen behandeln und verhindert, dass es weiter von sprudelnden. Wenn das Ereignis des ListBox-Handler erreicht, wird der Klick auf einen leeren Bereich der Steuer aufgetreten.

Alternativ können Sie versuchen, das OriginalSource Eigentum der Veranstaltung args Kontrolle, aber ich habe einige Probleme mit, dass in der Vergangenheit hat.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top