Wie finde ich in einem WPF-Raster die Zeile und Spalte an der Mausposition?

8

Ich habe ein WPF Grid mit einigen Zeilen und Spalten, z. B.

%Vor%

Mit einem Handler für MouseMove in der .cs-Datei, z. B.

%Vor%

Ich möchte in der Lage sein, welche Zeile und Spalte im Gitter die Maus zu finden, ist das möglich?

[Hinweis: Dies ist eine vereinfachte Version des Problems, so dass es ein wenig seltsam erscheint, es auf diese Weise zu präsentieren - es ist Teil eines Drag & amp; Drop zwischen den Gitterfunktionen]

    
Wilka 11.08.2009, 10:45
quelle

8 Antworten

15

Ich hoffe, Sie haben bereits eine Lösung gefunden. Ich hatte das gleiche Problem und fand diesen unbeantworteten Beitrag. Ich denke also, der nächste wird glücklich sein, diese Lösung zu finden:

%Vor%     
Nicolas 14.01.2011 14:46
quelle
5

Folgendes kann getan werden (sollte aber nicht bei größeren Gittern verwendet werden). Es ist nur für Zeilen, aber eine zweite Schleife kann auf die Spalten angewendet werden ...

Die Antwort von Nicolas funktioniert nur, wenn das Gitter einige UIElements enthält (deren Position im Gitter bestimmt ist - ich schätze, das würde auch Probleme verursachen, wenn ein Element mehrere Zeilen / Spalten umfasst).

%Vor%     
Andre 16.08.2012 17:10
quelle
2
%Vor%

Verwendung:

%Vor%     
Magikos 21.03.2014 20:52
quelle
1

Andre's Antwort hat einen kleinen Fehler, da die erhaltenen Koordinaten die Zeilen- und Spaltenüberschriften im DataGrid nicht berücksichtigen. Zumindest war das der Fall, als ich die Lösung in Visual Basic implementierte.

Sie können die angezeigten Beispiele auch ändern, um ein großes DataGrid zu berücksichtigen. Es scheint mir, dass die Einschränkung dort auf der Scroll-Ansicht basiert, also zeige ich zwei Implementierungen dieser Korrektur:

%Vor%

Beachten Sie, dass ScrollViewer.HorizontalOffset Property gibt einen Wert in Device Independent Pixels zurück, also versetze ich meine Position nur einmal, bevor ich die Spalten durchlaufe.

Beachten Sie, dass ScrollViewer.VerticalOffset Property gibt die Anzahl der Elemente zurück, wenn CanContentScroll = True ist. In meinem Beispiel habe ich also bei jeder Schleife den Zähler um die Höhe eines Elements (DataGridRow) versetzt. Wenn CanContentScroll = False ist, kann es wie im Fall der Spaltenindexschleife behandelt werden.

Ich konnte keine Zeilendefinitionen im DataGrid für .Net 4.0 in Visual Basic finden, aber die folgende unterstützende Funktion hilft beim Abrufen des DataGridRow:

%Vor%

Und die Funktion FindVisualChild in Visual Basic:

%Vor%     
PellucidWombat 21.05.2015 01:34
quelle
1

ersetzen Grid.ColumnDefinitions mit Bezug auf Grid-Komponente

%Vor%     
JLCNZ 03.08.2016 22:24
quelle
1

Hoffnung kann helfen. es funktioniert gut für meine App

%Vor%     
MemoryLeaks 31.03.2014 13:37
quelle
0

Ich hatte genau dein Problem und ich benutze auch FluidKit. Ich versuche, einen Formular-Designer zu erstellen, bei dem Sie ein Steuerelement aus einer Toolbox ziehen und in eine Grid-Zelle ablegen können. Hier ist, wie ich es gelöst habe:

Ich habe ein Raster mit zwei Dummy-Rechtecken in der ersten Reihe erstellt:

%Vor%

Es sieht so aus:

Beachten Sie, dass ich für jedes meiner Rechtecke einen DropTargetAdvisor definiert habe, jetzt lautet die Logik wie folgt:

  • Sie ziehen ein Control aus der Toolbox in eine Zelle
  • Die Methode OnDropCompleted in DropTargetAdvisor entfernt dann das Rechteck, in dem Sie das Steuerelement ablegen, und erhält seine Koordinaten aus den Eigenschaften Grid.Row und Grid.Column Attached.
  • Sobald Sie die Koordinaten haben, können Sie diese angehängten Eigenschaften auf Ihr gezogenes Steuerelement setzen und es Ihrem Raster hinzufügen.

Hier ist meine DefaultDropTargetAdvisor.OnDropCompleted Methode:

%Vor%     
Adolfo Perez 24.09.2012 20:14
quelle
0

Bei einem Telerik RadGridView ist der beste Ansatz, wenn das Raster keine UI-Elemente enthält, die Verwendung von ChildrenOfType & lt; & gt; in einem Linq-Ausdruck mit IsMouseOver.

%Vor%     
AshRolls 29.01.2015 16:24
quelle

Tags und Links