2010-12-28 5 views
43

Ich verwende ein DataGrid im Zeilenauswahlmodus (d. H. SelectionUnit="FullRow"). Ich möchte einfach den Rahmen entfernen, der um die aktuelle Zelle herum platziert wird, wenn der Benutzer eine Zeile markiert, um eine echte vollständige Zeilenauswahl (und keine Auswahl auf Zellenebene) zu erhalten. Es macht mir nichts aus, dass das Gitter die aktuelle Zelle beibehält, ich möchte nur die lästige aktuelle Zellengrenze entfernen, vielleicht indem ich den Stil der aktuellen Zelle ändere. Was ist der einfachste Weg, dies zu tun?DataGrid-Zellenrahmen im FullRow-Auswahlmodus deaktivieren

Antwort

88

könnten Sie setzen den BorderThickness für DataGridCell auf 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

Dies funktioniert nicht, wenn der Benutzer die Pfeiltasten verwendet. Der gepunktete Auswahlrahmen erscheint weiterhin in den Zellen. –

+14

@Michael Yanni: Sie sprechen über den 'FocusVisualStyle'. Um es zu deaktivieren, setze es im 'CellStyle' auf Null wie' ' –

+0

Wie bekomme ich den fehlenden Abstand der Zellen mit dem Rahmen zurück? bis 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

Das Hinzufügen dieser beiden Zeilen hilft dabei, den Stil des ResourceDictionary beizubehalten, danke @marius. – Rachel

0

Wenn Sie nur eine Grenze angezeigt werden soll, wenn die Zelle bearbeitet werden kann und ausgewählt Sie können die Datagridcell-Vorlage außer Kraft setzen und einen Multitrigger hinzu, wenn die Zelle ist ausgewählt und nicht IsReadOnly. Dann wird keine Grenze gezeigt für Zellen, wenn Sie IsReadOnly = true für die Spalte oder Datagrid setzen

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

Verwenden Sie die Vorlage in einem Stil

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

und verwenden Sie den Stil

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

Wenn Sie die xceed verwenden, stellen Sie die NavigationBehavior auf RowOnly

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

Sah hier eine andere Antwort, die nahe war, aber es wurde das Focus-Rechteck nicht los. Hier ist, wie man alle Grenzen auslöschen kann.

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

Da auch technisch noch jene Zellen Fokus erhalten Sie (Sie gerade sehen es nicht), mit der Tabulatortaste in der nächsten Zeile anstelle der nächsten Zelle zu machen, definiere ich einen Stil Zelle basierend auf das obige aber das fügt auch das folgende hinzu ...

... dann wende ich das an alle außer der ersten Spaltendefinition an. Auf diese Weise wird die Tabulatortaste zur nächsten Zeile und nicht zur nächsten Zelle weitergeleitet.

Zurück zu den Grenzen jedoch. Wenn Sie wollen, dass sie verstecken, aber immer noch wollen sie Teil des Layouts für abstands Gründen ändern, um die oben dazu ...

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

Genießen Sie sein! :)

+0

Dies ist noch näher, aber es gibt noch eine Einschränkung: Wenn Sie auf Spalte 0 klicken, erhalten Sie den aktiven Markierungspinsel (wie erwartet), aber wenn Sie auf Spalte 1 klicken, erhalten Sie den inaktiven Markierungspinsel (unerwartet). Der inaktive Pinsel klemmt (klickt auf andere Zeilen), bis Sie auf Spalte 0 klicken. Dann bleibt der aktive Pinsel haften, bis das DataGrid den Fokus verliert. –

+0

Interessant. Ich habe das vorher nicht gesehen, aber ich werde es jetzt definitiv versuchen. Der Grund, warum ich das hinzugefügt habe, war jedoch, die Tab-Reihenfolge zu korrigieren. Das heißt, vielleicht ist die Behebung so einfach wie focusable = false zu istabstop = false zu ändern. Es sollte das Gleiche erreichen. – MarqueIV

+0

Ich habe gerade versucht, die 'IsTabStop =" False "' zwicken und es scheint alle Fälle abzudecken. Technisch betrachtet erhält die Zelle ohne erste Spalte den Fokus, wenn Sie auf klicken und Sie können den Pfeil nach links/rechts bewegen, um den Fokus auf andere Zellen zu ändern, aber die erste Zelle oder das nächste Steuerelement der nächsten Zeile wird markiert (wenn eine der Zellen der letzten Zeile fokussiert ist) . Ich bezweifle jedoch, dass das ein Problem ist. Vielleicht für Screenreader? Trotzdem danke! –

Verwandte Themen