2010-12-27 2 views
38

Я застрял в одной очень глупой проблеме - нужно стилизовать выбранную строку в WPF DataGrid.WPF DataGrid выбран стиль строки

Я хочу показать прямоугольник с синей рамкой вместо того, чтобы просто заполнить всю строку цветом.

Любые идеи, как реализовать это? Это должно быть каким-то образом сделать это довольно легко.

ответ

78

Использование CellStyle и RowStyle на DataGrid. DataGridCell и DataGridRow оба имеют IsSelected свойство, которое может использоваться в Trigger, чтобы узнать, выбраны ли они.

Нечто подобное следующему должен сделать трюк:

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

Просто играть вокруг, пока вы не получите это право.

+1

Пограничный делает только, как я хотел, но я ничего не могу с фоном/цвета переднего плана, сделать при выборе строки It заполняется сплошным синим –

+0

Я не понимаю. Вы пытаетесь сказать, что цвета «Background» и «Foreground» не применяются? Можете ли вы опубликовать код, который вы использовали? Какую версию WPF вы используете? – decyclone

+0

Извините, все работает просто отлично, спасибо) –

5

попробовать это

<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

Я пробовал это решение. Оно работает. но затем она представила еще одну проблему. У меня есть одна гиперсвязанная ячейка в строке. Если я использую этот сеттер на IsSelected = true. то мне нужно дважды нажать гиперссылку. есть ли способ избежать этого? – deathrace

5

Мне нравится этот один:

<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> 
Смежные вопросы