2010-12-28 15 views
43

Sto utilizzando un DataGrid nella modalità di selezione riga (ad esempio, SelectionUnit="FullRow"). Voglio semplicemente rimuovere il bordo che viene posizionato attorno alla cella corrente quando l'utente evidenzia una riga per avere una vera selezione completa delle righe (e nessuna selezione del livello di cella). Non mi interessa la nozione della griglia che mantiene la cella corrente, voglio solo rimuovere quel fastidioso bordo della cella corrente, magari cambiando lo stile della cella corrente. Qual è il modo più semplice per farlo?Disattiva bordo cella DataGrid corrente nella modalità di selezione FullRow

risposta

88

È possibile impostare la BorderThickness per DataGridCell a 0

<DataGrid ... 
      SelectionUnit="FullRow"> 
    <DataGrid.CellStyle> 
     <Style TargetType="DataGridCell"> 
      <Setter Property="BorderThickness" Value="0"/> 
      <!-- Update from comments. 
       Remove the focus indication for the selected cell --> 
      <Setter Property="FocusVisualStyle" Value="{x:Null}"/> 
     </Style> 
    </DataGrid.CellStyle> 
    <!-- ... --> 
</DataGrid> 
+1

Questo non funziona se l'utente utilizza i tasti freccia. Il bordo di selezione della linea tratteggiata appare ancora nelle celle. –

+14

@ Michael Yanni: Stai parlando di "FocusVisualStyle". Per disabilitarlo, impostarlo su null in 'CellStyle' come' ' –

+0

Come posso recuperare la spaziatura mancante delle celle con il bordo impostato a 0? – ygoe

6
<Style x:Key="DataGrid" TargetType="DataGrid"> 
    <Setter Property="CellStyle"> 
     <Setter.Value> 
      <Style TargetType="DataGridCell"> 
       <Setter Property="BorderThickness" Value="0"/> 
       <Setter Property="Foreground" Value="{Binding Foreground, RelativeSource={RelativeSource TemplatedParent}}" /> 
       <Setter Property="Background" Value="{Binding Background, RelativeSource={RelativeSource TemplatedParent}}" /> 
      </Style> 
     </Setter.Value> 
    </Setter> 
</Style> 
+0

L'aggiunta di queste due linee aiuta a mantenere lo stile applicato da ResourceDictionary, grazie a @marius. – Rachel

0

Se si desidera visualizzare un bordo solo quando la cella è modificabile e selezionato è possibile ignorare il modello DataGridCell e aggiungere un MultiTrigger per quando la cella IsSelected e non IsReadOnly. Poi verrà mostrato nessun bordo per le celle se si imposta IsReadOnly = true per la colonna o DataGrid

<ControlTemplate x:Key="MellowDataGridCellTemplate" TargetType="{x:Type DataGridCell}"> 
    <Grid> 
     <ContentPresenter VerticalAlignment="Center" /> 
     <Rectangle Name="FocusVisual" Stroke="White" StrokeThickness="1" Fill="Transparent" HorizontalAlignment="Stretch" 
          VerticalAlignment="Stretch" IsHitTestVisible="false" Opacity="0" /> 

    </Grid> 
    <ControlTemplate.Triggers> 
     <MultiTrigger> 
      <MultiTrigger.Conditions> 
       <Condition Property="IsReadOnly" Value="False" /> 
       <Condition Property="IsSelected" Value="True" /> 
      </MultiTrigger.Conditions> 
      <Setter TargetName="FocusVisual" Property="Opacity" Value="1"/> 
     </MultiTrigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

Utilizzare la mascherina in stile

<Style TargetType="{x:Type DataGridCell}" x:Key="MellowGridDataGridCell"> 
    <Setter Property="Template" Value="{StaticResource MellowDataGridCellTemplate}" /> 
</Style> 

e utilizzare lo stile

<DataGrid CellStyle={StaticResource MellowGridDataGridCell > 
    ... 
</DataGrid> 
0

Se si utilizza il xceedDataGridControl quindi impostare il NavigationBehavior-RowOnly

<xcdg:DataGridControl NavigationBehavior="RowOnly" SelectionMode="Single" .... 
7

Ho visto un'altra risposta qui che era vicina, ma non ha eliminato il rettangolo Focus. Ecco come cancellare tutti i confini.

<DataGrid.Resources> 
    <Style TargetType="{x:Type DataGridCell}"> 
     <Setter Property="BorderThickness" Value="0" /> 
     <Setter Property="FocusVisualStyle" Value="{x:Null}" /> 
    </Style> 
</DataGrid.Resources> 

Inoltre, dal momento che tecnicamente quelle cellule ancora fanno ottenere messa a fuoco (basta non vede), per rendere l'avanzata tasto tab alla riga successiva invece della cella successiva, ho definire uno stile di cella sulla base di quanto sopra, ma che aggiunge anche il seguente ...

<DataGrid.Resources> 
    <Style x:Key="NoFocusDataGridCell" TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource {x:Type DataGridCell}}"> 
     <Setter Property="Focusable"  Value="False" /> 
     <Setter Property="IsTabStop"  Value="False" /> 
     <Setter Property="IsHitTestVisible" Value="False" /> 
    </Style> 
</DataGrid.Resources> 

... poi applico che a tutti, ma la prima definizione di colonna. In questo modo il tasto Tab avanzerà alla riga successiva, non alla cella successiva.

Torna ai confini comunque. Se si desidera nascondere loro, ma ancora desidera che siano parte del layout per la spaziatura-motivi, cambiano quanto sopra a questo ...

<DataGrid.Resources> 
    <Style TargetType="{x:Type DataGridCell}"> 
     <Setter Property="BorderBrush" Value="Transparent" /> 
     <Setter Property="FocusVisualStyle" Value="{x:Null}" /> 
    </Style> 
</DataGrid.Resources> 

Enjoy! :)

+0

Questo è ancora più vicino ma c'è ancora un avvertimento: se si fa clic sulla colonna 0 si ottiene il pennello di selezione attivo (come previsto), ma facendo clic sulla colonna 1+ si ottiene il pennello di selezione di selezione inattiva (imprevisto). I pennelli inattivi (facendo clic su altre righe) fino a fare clic sulla colonna 0. Quindi il pennello attivo rimane attivo fino a quando il DataGrid non viene messo a fuoco. –

+0

Interessante. Non lo vedevo prima, ma sicuramente lo proverò ora. Il motivo per cui stavo aggiungendo che comunque era per fissare l'ordine di tabulazione. Detto questo, forse la correzione è semplice come cambiarla da focusable = false a istabstop = false. Dovrebbe ottenere la stessa cosa. – MarqueIV

+0

Ho appena provato il comando 'IsTabStop =" False "' e sembra coprire tutti i casi. Tecnicamente la cella non di prima colonna riceve lo stato attivo quando si fa clic e si può usare la freccia sinistra/destra per cambiare lo stato attivo su altre celle, ma la tabulazione passa alla prima cella della riga successiva o al controllo successivo (se una delle celle dell'ultima riga è focalizzata) . Tuttavia, dubito che sia un problema. Forse per i lettori di schermo? Comunque grazie! –

Problemi correlati