2012-11-01 11 views
5

Ho un DataGrid impostato con un evento PreviewMouseDown in un controllo utente. L'idea è che quando un utente sposta il mouse in una cella, imposta un'azione da eseguire in base al contenuto della cella e l'azione verrà eseguita quando l'utente fa clic, indipendentemente dal pulsante del mouse.
mio gestore di eventi (C#):WPF DataGrid PreviewMouseDown che non gestisce il clic destro come previsto

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

mio 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"> 

Questo funziona, e funziona l'azione correttamente clic quando un utente a destra oa sinistra sopra il DataGrid. Il problema, tuttavia, è che quando l'utente fa clic con il tasto destro, viene selezionata la cella in cui si trova il mouse (viene visualizzato un bordo nero attorno alla cella); questo non accade quando hanno lasciato il clic.

Perché si comportano in modo diverso? Non dovrebbero essere gestiti allo stesso modo? C'è qualcosa di veramente semplice che mi manca?

Grazie in anticipo!

EDIT:
ho finora provato DataGrid.UnselectAll(), DataGrid.UnselectAllCells(), DataGrid.SelectedIndex = -1, e DataGrid.CurrentCell = default (DataGridCellInfo). Nessuno di loro ha funzionato per me.

EDIT # 2:
Se è utile, sto utilizzando DataGridTemplateColumns con TextBlocks per visualizzare i miei dati. Questo potrebbe causare questo comportamento?

SOLUZIONE:
Questo è stato risolto con Peter Hansen s' il suggerimento che era quello di aggiungere un evento PreviewMouseRightButtonDown al DataGrid così come l'evento PreviewMouseDown.

risposta

4

Penso che quello che stai vedendo sia il bordo della cella, che viene visualizzato quando è attivo.

È possibile rimuoverlo impostando il suo spessore a 0 in questo modo:

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

Aggiornamento:
A quanto pare quando si imposta l'evento PreviewMouseDown da trattare, il DataGrid si ferma solo selezioni di celle quando si usa il tasto sinistro del mouse.

È necessario gestire anche PreviewMouseRightButtonUp per impedire a rightclicks di selezionare le celle.

Penso che risolverebbe il tuo problema?

+0

Grazie per aver risposto, sfortunatamente questo non sembra averlo risolto. Potrebbe interessarti sapere che, nonostante il mio DataGrid sia impostato su Single SelectionMode, è possibile evidenziare più celle se faccio clic dopo che un articolo è stato aggiunto o rimosso. Le altre celle selezionate sembrano avere un bordo blu invece di uno nero. –

+0

Ho aggiornato la mia risposta - spero che ti aiuti ora .. –

+0

Oh wow che è interessante, aggiungendo il PreviewMouseRightButtonUp risolto. Avrei giurato di averlo provato prima, ma in realtà ho provato PreviewMouseRightButtonDown prima che non funzionasse. Grazie per l'aiuto! –

1

Dovresti essere in grado di chiamare il metodo UnselectAllCells fornito con DataGrid. Sembra semplicemente in questo modo:

dataGrid.UnselectAllCells(); 

chiamata questo dopo aver eseguito l'azione clic e si dovrebbe rimuovere la selezione delle cellule.

EDIT: Penso che il tuo dataGrid.UnselectAllCells() non stia invocando perché sei ancora nell'evento PreviewMouseDown. Prova a creare un evento PreviewRightMouseUpup corrispondente e deseleziona le tue celle lì. Il momento in cui invochi questo metodo potrebbe essere cruciale per il suo successo.

+0

Ho modificato la mia domanda per rispondere a questo, ma questo non ha funzionato. La cella ha ancora quel bordo attorno ad esso. –

+0

aggiornerò la mia risposta. –