2010-12-27 18 views
38

Utknąłem z jednym bardzo głupi problem - trzeba styl zaznaczonego wiersza w WPF DataGrid.Wybrany styl wiersza WPF DataGrid

Chcę pokazać prostokąt z niebieskim obramowaniem zamiast wypełniania całego wiersza pewnym kolorem.

Jakieś pomysły, jak to wdrożyć? To musi być po prostu dość proste.

Odpowiedz

78

Użyj CellStyle i RowStyle na DataGrid. DataGridCell i DataGridRow mają właściwość IsSelected, której można użyć w Trigger, aby sprawdzić, czy są wybrane.

Coś jak następujące powinny rade:

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

tylko bawić, aż pojawi się to dobrze.

+1

Graniczna renderowania, jak chciałem, ale nie mogę nic z tłem/planie kolory, robić przy wyborze wiersza It jest wypełnione jednolitym niebieskim –

+0

Nie rozumiem. Czy próbujesz powiedzieć, że kolory 'Background' i' Firstground' nie mają zastosowania? Czy możesz opublikować kod, którego używałeś? Którą wersję WPF używasz? – decyclone

+0

Przepraszam, wszystko działa dobrze, dzięki) –

5

spróbować

<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

Próbowałem tego rozwiązania. To działa. ale potem wprowadził inny problem. Mam jedną komórkę hiper-połączoną z rzędu. Jeśli zastosuję to ustawienie na IsSelected = true. następnie muszę dwukrotnie kliknąć hiperłącze. Czy jest jakiś sposób, aby tego uniknąć? – deathrace

5

Lubię to jedno:

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