2010-12-27 15 views
38

Sono bloccato con un problema molto stupido: è necessario impostare lo stile della riga selezionata in WPF DataGrid.WPF DataGrid stile riga selezionato

Voglio mostrare un rettangolo con bordo blu invece di riempire l'intera riga con un po 'di colore.

Qualche idea su come implementarlo? Deve solo essere un modo per renderlo abbastanza facile.

risposta

78

Utilizzare CellStyle e RowStyle su DataGrid. DataGridCell e DataGridRow entrambi hanno la proprietà IsSelected che può essere utilizzata in un Trigger per scoprire se sono selezionati.

Qualcosa come segue dovrebbe fare il trucco:

<DataGrid.CellStyle> 
    <Style TargetType="DataGridCell"> 
     <Style.Triggers> 
      <Trigger Property="IsSelected" 
         Value="True"> 
       <Setter Property="Background" 
         Value="White" /> 
       <Setter Property="Foreground" 
         Value="Black" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</DataGrid.CellStyle> 
<DataGrid.RowStyle> 
    <Style TargetType="DataGridRow"> 
     <Style.Triggers> 
      <Trigger Property="IsSelected" 
         Value="True"> 
       <Setter Property="BorderBrush" 
         Value="Blue" /> 
       <Setter Property="BorderThickness" 
         Value="2" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</DataGrid.RowStyle> 

solo giocare intorno fino a farlo bene.

+1

sta rendendo proprio come volevo, ma non posso fare nulla con sfondo/colori di primo piano, quando si seleziona una riga E ' si sta riempiendo di un blu fisso –

+0

non capisco. Stai cercando di dire che i colori 'Background' e' Primo piano' non si applicano? Puoi pubblicare il codice che hai usato? Quale versione di WPF stai usando? – decyclone

+0

Scusa, tutto funziona bene, grazie) –

5

provare questo

<DataGrid.Resources> 
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent"/> 

        <Style TargetType="{x:Type DataGridRow}"> 
         <Setter Property="HeaderStyle"> 
          <Setter.Value> 
           <Style TargetType="{x:Type DataGridRowHeader}"> 
            <Setter Property="Visibility" Value="Collapsed"/> 
            <Setter Property="Width" Value="0"/> 
           </Style> 
          </Setter.Value> 
         </Setter> 
         <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/> 
         <Setter Property="SnapsToDevicePixels" Value="true"/> 
         <Setter Property="Validation.ErrorTemplate" Value="{x:Null}"/> 
         <Setter Property="ValidationErrorTemplate"> 
          <Setter.Value> 
           <ControlTemplate> 
            <TextBlock Foreground="Red" Margin="2,0,0,0" Text="!" VerticalAlignment="Center"/> 
           </ControlTemplate> 
          </Setter.Value> 
         </Setter> 

         <Setter Property="Template"> 
          <Setter.Value> 
           <ControlTemplate TargetType="{x:Type DataGridRow}"> 
            <Border x:Name="DGR_Border" BorderThickness="1" CornerRadius="5" Background="{TemplateBinding Background}" SnapsToDevicePixels="True"> 
             <SelectiveScrollingGrid> 
              <SelectiveScrollingGrid.ColumnDefinitions> 
               <ColumnDefinition Width="Auto"/> 
               <ColumnDefinition Width="*"/> 
              </SelectiveScrollingGrid.ColumnDefinitions> 
              <Grid Grid.Column="1"> 
               <Grid.RowDefinitions> 
                <RowDefinition Height="*"/> 
                <RowDefinition Height="Auto"/> 
               </Grid.RowDefinitions> 
               <DataGridCellsPresenter ItemsPanel="{TemplateBinding ItemsPanel}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
               <DataGridDetailsPresenter Margin="4" Grid.Row="1" SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding AreRowDetailsFrozen, ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical}, Converter={x:Static DataGrid.RowDetailsScrollingConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" Visibility="{TemplateBinding DetailsVisibility}"/> 

               <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Grid.RowSpan="2"/> 
              </Grid> 
              <DataGridRowHeader SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical" Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Row}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/> 
             </SelectiveScrollingGrid> 
            </Border> 
            <ControlTemplate.Triggers> 
             <Trigger Property="IsSelected" Value="True"> 
              <Setter TargetName="DGR_Border" Property="BorderBrush" Value="Blue"/> 
             </Trigger> 
            </ControlTemplate.Triggers> 
           </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
         <Style.Triggers> 
          <Trigger Property="DetailsVisibility" Value="Visible"> 
           <Setter Property="BorderThickness" Value="4,1,4,4"/> 
           <Setter Property="BorderBrush" Value="#FF3886B9"/> 
          </Trigger> 
          <!--<Trigger Property="IsSelected" Value="True"> 
           <Setter Property="BorderBrush" Value="Blue"/> 
          </Trigger>--> 
         </Style.Triggers> 
        </Style> 

       </DataGrid.Resources> 
+0

Ho provato questa soluzione. Funziona. ma poi ha introdotto un altro problema. Ho una cella collegata iper collegata di fila. Se applico questo setter su IsSelected = true. quindi ho bisogno di cliccare su hyper link due volte. c'è un modo per evitarlo? – deathrace

5

ho come questo: Bordo

<Style TargetType="{x:Type DataGridRow}"> 
    <Setter Property="BorderBrush" Value="LightGray" /> 
    <Setter Property="BorderThickness" Value="1" /> 
    <Style.Triggers> 
     <Trigger Property="IsSelected" Value="True"> 
      <Setter Property="BorderBrush" Value="Blue" /> 
     </Trigger> 
    </Style.Triggers> 
    <Style.Resources> 
     <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" /> 
     <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" /> 
    </Style.Resources> 
</Style>