2012-11-01 4 views
5

Ich habe ein DataGrid mit einem PreviewMouseDown-Ereignis in einem Benutzersteuerelement eingerichtet. Wenn ein Benutzer seine Maus in eine Zelle bewegt, legt er fest, dass eine Aktion basierend auf dem Inhalt der Zelle ausgeführt wird, und die Aktion wird ausgeführt, wenn der Benutzer klickt, unabhängig davon, welche Maustaste gedrückt wird.
Meine Event-Handler (C#):WPF DataGrid PreviewMouseDown wird nicht wie erwartet mit der rechten Maustaste verarbeitet

private void LadderMouseClick(object sender, System.Windows.Input.MouseButtonEventArgs e) { 
     if (m_ActiveAction != null) { 
      m_ActiveAction(); 
     } 
     e.Handled = true; 
    } 

My Datagrid (XAML):

<DataGrid AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserSortColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding Source={StaticResource sourceCollection}}" Name="DataGrid" RowDetailsVisibilityMode="Collapsed" IsReadOnly="True" Height="600" MouseLeave="DataGrid_MouseLeave" MouseEnter="DataGrid_MouseEnter" PreviewMouseDown="LadderMouseClick" PreviewMouseDoubleClick="LadderMouseDoubleClick" VerticalScrollBarVisibility="Hidden" SelectionUnit="Cell" SelectionMode="Single"> 

Dies funktioniert, und führt die Aktion richtig, wenn ein Benutzer entweder rechts oder links Klicks über das Datagrid. Das Problem besteht jedoch darin, dass, wenn der Benutzer mit der rechten Maustaste klickt, die Zelle ausgewählt wird, in der sich die Maus befindet (um die Zelle erscheint ein schwarzer Rand); Dies passiert nicht, wenn sie das Klicken verließen.

Warum verhalten sie sich anders? Sollten sie nicht auf die gleiche Weise behandelt werden? Gibt es etwas wirklich einfaches, was mir fehlt?

Vielen Dank im Voraus!

EDIT:
Ich habe bisher versucht DataGrid.UnselectAll(), DataGrid.UnselectAllCells(), DataGrid.SelectedIndex = -1 und DataGrid.CurrentCell = default (DataGridCellInfo). Keiner von ihnen hat für mich gearbeitet.

EDIT # 2:
Wenn es hilft, ich bin mit DataGridTemplateColumns mit Textblöcken meine Daten anzuzeigen. Könnte dies zu diesem Verhalten führen?

LÖSUNG:
Diese von Peter Hansen ‚s Vorschlag gelöst wurde, die eine Preview Ereignis an das Datagrid sowie die Preview Ereignis hinzuzufügen war.

Antwort

4

Ich denke, was Sie sehen, ist der Rand der Zelle, die angezeigt wird, wenn es Fokus hat.

Sie können es entfernen, indem seine Dicke auf 0 gefällt diese Einstellung:

<DataGrid.CellStyle> 
    <Style TargetType="DataGridCell"> 
     <Setter Property="BorderThickness" Value="0" /> 
    </Style> 
</DataGrid.CellStyle> 

Update:
Anscheinend, wenn Sie das PreviewMouseDown Ereignis gesetzt behandelt werden, das Datagrid hält nur Auswahl von Zellen, wenn Sie benutze die linke Maustaste.

Sie müssen auch PreviewMouseRightButtonUp behandeln, um Rechtsklick von der Auswahl von Zellen zu stoppen.

Ich denke, das würde dein Problem lösen?

+0

Danke für die Antwort, leider schien dies nicht zu beheben. Vielleicht möchten Sie wissen, dass mehrere Zellen markiert werden können, wenn ich nach dem Hinzufügen oder Entfernen eines Elements auf ein Element klicke, obwohl mein DataGrid auf Single SelectionMode eingestellt ist. Die anderen ausgewählten Zellen scheinen einen blauen anstelle eines schwarzen zu haben. –

+0

Ich habe meine Antwort aktualisiert - hoffe, es hilft Ihnen jetzt .. –

+0

Oh wow, das ist interessant, Hinzufügen der PreviewMouseRightButtonUp behoben. Ich hätte schwören können, dass ich das schon einmal probiert habe, aber ich habe PreviewMouseRightButtonDown probiert, bevor das nicht funktioniert hat. Danke für Ihre Hilfe! –

1

Sie sollten in der Lage sein, die UnselectAllCells-Methode aufzurufen, die mit DataGrids geliefert wird. Es sieht einfach wie folgt aus:

dataGrid.UnselectAllCells(); 

Rufen Sie diese nach dem Klick-Aktion durchführen, und es sollte die Zellauswahl entfernen.

EDIT: Ich denke, dass Ihre dataGrid.UnselectAllCells() nicht aufgerufen wird, weil Sie noch im PreviewMouseDown-Ereignis sind. Versuchen Sie, ein entsprechendes PreviewRightMouseButtonUp-Ereignis zu erstellen, und heben Sie die Auswahl der Zellen dort auf. Die Zeit für den Fall, dass Sie diese Methode aufrufen, könnte entscheidend für den Erfolg sein.

+0

Ich habe meine Frage bearbeitet, um darauf zu antworten, aber das hat nicht funktioniert. Die Zelle hat immer noch diese Grenze. –

+0

Ich werde meine Antwort aktualisieren. –

Verwandte Themen