2016-07-08 7 views
0

У меня есть стилизованное окно, и я хочу, чтобы переопределить стиль DataGrid для ВСЕХ DataGrids в моем приложенииКак переопределить стиль DataGrid

<Window.Resources>   
    <Style x:Name="dtgStyle" TargetType="{x:Type DataGridRow}"> 
     <Style.Triggers> 
      <Trigger Property="IsMouseOver" Value="True"> 
       <Setter Property="Background" Value="Transparent" /> 
      </Trigger> 

     <Trigger Property="IsSelected" Value="True"> 
      <Setter Property="Background" Value="Blue" /> 
     </Trigger> 

      <Trigger Property="IsSelected" Value="False"> 
       <Setter Property="Background" Value="Transparent" /> 
      </Trigger> 
     </Style.Triggers> 

     <Setter Property="Background" Value="Transparent" /> 
     <Setter Property="Foreground" Value="White" /> 

    </Style> 
</Window.Resources> 

Я thougth это должен был работать, но я должен применить

Style s = Resources["dtgStyle"] as Style; 
mydtg.Style = s; 

теперь мне не хотелось бы применять это для ВСЕХ dtgs. Лучше всего было бы автоматически применить его в xaml.

Thanx

--- ADD для АШ ----

Спасибо за вашу помощь. Единственная проблема заключается в том, что когда datagrid теряет фокус, выбранная строка в datagrid меняет цвет, как вы можете видеть на следующем рисунке (передний план превращается в черный).

enter image description here

Я пытался добавить различные свойства, но ничего не работает.

Кроме того, левая граница становится более смелой (без каламбур) и больше. Любая идея, как это исправить? Спасибо

+0

'TargetType = "{х: Тип DataGridRow}" '. это стиль DataGridRow, а не DataGrid. И он должен применяться по умолчанию, потому что нет явного ключа – ASh

+0

Thanx, поэтому я изменил имя DatagridRow на dtrStyle и добавил но как добавить правильный стиль сейчас? – Patrick

+0

@Patrick Как вы устанавливаете 'TargetType =" {x: Type DataGridRow} "', вы можете установить для 'DataGrid'. Подумаешь ? Что вы пытаетесь достичь? – AnjumSKhan

ответ

2

, если вам нужен стиль по умолчанию для FrameworkElement, объявите его без x:Key, только с TargetType.

Оба DataGridRow и DataGridCell имеют свойство IsSelected. Не достаточно, чтобы изменить фон только для DataGridRow, это должно быть сделано для DataGridCell а

<Style TargetType="{x:Type DataGrid}"> 
    <Setter Property="RowStyle" > 
     <Setter.Value> 
      <Style TargetType="{x:Type DataGridRow}" BasedOn="{StaticResource {x:Type DataGridRow}}"> 
       <Setter Property="Background" Value="Transparent" /> 
       <Setter Property="Foreground" Value="White" /> 

       <Style.Triggers> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter Property="Background" Value="Transparent" /> 
        </Trigger> 

        <Trigger Property="IsSelected" Value="True"> 
         <Setter Property="Background" Value="Orange" /> 
         <Setter Property="Foreground" Value="White" /> 
        </Trigger> 
       </Style.Triggers> 

      </Style> 
     </Setter.Value> 
    </Setter> 

    <Setter Property="CellStyle"> 
     <Setter.Value> 
      <Style TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource {x:Type DataGridCell}}"> 
       <Style.Triggers> 
        <Trigger Property="IsSelected" Value="True"> 
         <Setter Property="Background" Value="Orange" /> 
        </Trigger> 

        <DataTrigger Binding="{Binding IsKeyboardFocusWithin, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" Value="False"> 
         <Setter Property="Foreground" Value="White"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Setter.Value> 
    </Setter> 
</Style> 

фикс для переднего плана был найден здесь: DataGrid's selected row color when inactive (https://stackoverflow.com/a/25204493/1506454)

+0

Спасибо за помощь, пожалуйста, посмотрите мое маленькое (запоздалое) редактирование. – Patrick

+0

@Patrick, я обновил свой ответ с исправлением для Foreground. Я также посмотрел на скриншот с увеличением. Заголовок не меняет свой размер на самом деле, только цвет – ASh

+0

Работает как шарм thanx! – Patrick

Смежные вопросы