2016-03-30 3 views
0

У меня есть приложение WPF, я создал стиль DataGrid в App.xaml для применения всего приложения.Попытка применить несколько стилей к DataGridRow

App.xaml

<Style TargetType="DataGrid" x:Key="GridStyle1"> 
    <Setter Property="HorizontalGridLinesBrush" Value="LightGray" /> 
    <Setter Property="VerticalGridLinesBrush" Value="LightGray" /> 
    <Setter Property="AlternatingRowBackground" Value="WhiteSmoke" /> 
    <Setter Property="RowHeight" Value="30" /> 
    <Setter Property="RowStyle"> 
     <Setter.Value> 
      <Style TargetType="DataGridRow"> 
       <Style.Triggers> 
        <Trigger Property="IsSelected" Value="True"> 
         <Setter Property="Background" Value="Cyan" /> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </Setter.Value> 
    </Setter> 
</Style> 

Затем в окне:

Window1.xaml

<Style TargetType="DataGridRow" BasedOn="{StaticResource {x:Type DataGridRow}}"> 
    <Setter Property="FontStyle" Value="Italic" /> 
</Style> 

Проблема, что стиль окна не применяется (стиль шрифта не курсив)

+0

Если вы на самом деле применяете 'GridStyle1' к вашему' DataGrid', то этот стиль устанавливает стиль для DataGridRow' в этом 'DataGrid', и стиль по умолчанию, который вы создали, конечно, игнорируется. Появляются ли ваши данные DataGridRow с голубым фоном? Попробуйте добавить тот же атрибут 'BasedOn' к стилю, который устанавливает голубой фон. Вероятно, это тот, который используется. Могут возникнуть другие проблемы, но сначала попробуйте это. –

+0

Я пробовал добавить тот же атрибут BaseOn к голубому фону, но он бесполезен, тот же результат я получаю (применяется голубой фон, но FontStyle не курсив). –

+0

Вы добавили fontstyle к этому? –

ответ

0

Похоже, вы хотите применить глобальный стиль к каждому DataGridRow в каждый DataGrid в нескольких окнах, а также вы хотите применить дополнительно стилизация до DataGridRow в одном или нескольких DataGrid s в одном конкретном окне.

Если вы узнали CSS раньше, вы можете ожидать, таблицы стилей кумулятивные: В CSS, если применить tr.style1 глобально и локально tr.style2, вы получаете как с tr.style2 выигравшей жеребьевку в любых случаях, когда они устанавливают один и тот же атрибут ,

Это не то, как стили работают в XAML. В XAML элемент может наследовать стиль от своего родителя, но он может иметь не более одного Style. Кроме того, как вы нашли, Style имеет свойство BasedOn. Вы можете основывать один стиль на другом и получать кумулятивные эффекты обоих.

Наконец, существует несколько способов применения стиля. Вы обнаружили, что можете применить их к каждому элементу данного типа в заданной области.

К сожалению, поскольку все зависит от контекста, способ применения стилей XAML может быть очень запутанным сначала (а во-вторых, а иногда и третьим). Особенно, когда вы используете один стиль (GridStyle1), чтобы применить другой стиль. Не всегда очевидно, что переопределяет то, что.

Лучше всего держать все как можно проще. Мы избавимся от этого набора RowStyle, потому что он нам не нужен. Мы просто создадим глобальный DataGridRowStyle, который применяется по умолчанию к каждому DataGridRow везде, а затем мы переопределим это специально в окне1.xaml.

App.xaml

<Application.Resources> 
    <Style TargetType="DataGridRow" BasedOn="{StaticResource {x:Type DataGridRow}}"> 
     <Setter Property="Background" Value="Cyan" /> 
    </Style> 
</Application.Resources> 

Window1.xaml

<Window.Resources> 
    <Style TargetType="DataGridRow" BasedOn="{StaticResource {x:Type DataGridRow}}"> 
     <Setter Property="FontStyle" Value="Italic" /> 
    </Style> 
</Window.Resources> 

Это будет применяться к каждому DataGridRow в этом окне. Атрибут BasedOn будет ссылаться на любой стиль, который уже был определен для DataGridRow в любом содержащем контексте - обычно это означает App.xaml, и если мы ничего не добавим, это будет иметь место здесь.

Разница между этим и тем, что у вас было, это то, что вы применяли стиль Cyan Background по-другому: стиль DataGridRow, примененный в приложении.xaml был применен с помощью устройства RowStyle в вашем стиле DataGrid. Этот стиль был BasedOn WPF ранее существовавший по умолчанию Style для DataGridRow, а затем он был принудительно применен к каждому DataGridRow в каждом DataGrid, который использовал стиль GridStyle1.

DataGridRow стиль вы определили в Window1.xaml бы применили, если DataGrid.RowStyle еще не был установлен в GridStyle1.

Но, как мы видели, вам не нужно использовать RowStyle, чтобы применить стиль по всему миру к каждому DataGridRow. Вы можете сделать это со стилем по умолчанию для этого типа, как в моем вышеприведенном фрагменте App.xaml. DataGrid.RowStyle полезен для индивидуально переопределение глобального стиля DataGridRow на одном конкретном DataGrid. Но вы не хотите делать это глобально! Так что ваши стили в App.xaml должен выглядеть следующим образом:

app.xaml

<Style TargetType="DataGrid" x:Key="GridStyle1"> 
    <Setter Property="HorizontalGridLinesBrush" Value="LightGray" /> 
    <Setter Property="VerticalGridLinesBrush" Value="LightGray" /> 
    <Setter Property="AlternatingRowBackground" Value="WhiteSmoke" /> 
    <Setter Property="RowHeight" Value="30" /> 
</Style> 

<Style TargetType="DataGridRow" BasedOn="{StaticResource {x:Type DataGridRow}}"> 
    <Setter Property="Background" Value="Cyan" /> 
</Style> 

И снова, вот Style в Window1.xaml

<Style TargetType="DataGridRow" BasedOn="{StaticResource {x:Type DataGridRow}}"> 
    <Setter Property="FontStyle" Value="Italic" /> 
</Style> 

Extra Credit

Указанные выше стили должны решить вашу проблему.

Но есть и другие способы приблизиться к этому материалу. Если вам не очень нравится то, что мы делали выше, то последующее может просто добавить путаницу, поэтому, если вы начнете читать это, и вы обнаружите, что чем больше вы читаете, тем меньше вы понимаете - тогда перестаньте читать! Это может подождать!

Вы также могли бы сделать весь текст в DataGrid быть наклонным, но изменяет заголовки тоже, так что я не думаю, что это то, что вы хотите:

<DataGrid 
    FontStyle="Italic" 
    /> 

Если вы хотите применить этот Italic стиль на просто одна сетка в окне1.xaml, вот как это сделать. Если мы добавим атрибут x:Key к Style, он не будет применяться к каждому DataGridRow в области. Вместо этого он просто сидит там, ожидая, что его будет использовать по имени StaticResource.

Window1.xaml

<Window.Resources> 
    <Style x:Key="ItalicDataGridRowStyle" 
      TargetType="DataGridRow" BasedOn="{StaticResource {x:Type DataGridRow}}"> 
     <Setter Property="FontStyle" Value="Italic" /> 
    </Style> 
</Window.Resources> 

<-- ... --> 

<!-- One grid with italic rows --> 
<DataGrid 
    x:Name="dataGrid1" 
    RowStyle="{StaticResource ItalicDataGridRowStyle}" 
    /> 

<!-- And another grid with default rows --> 
<DataGrid 
    x:Name="dataGrid2" 
    /> 

А вот еще один способ, чтобы применить стиль к рядам всего одна сетка в Window1.xaml:

<!-- Yet another grid --> 
<DataGrid 
    x:Name="dataGrid3" 
    > 
    <DataGrid.RowStyle> 
     <Style TargetType="DataGridRow" BasedOn="{StaticResource ItalicDataGridRowStyle}"> 
      <Setter Property="FontWeight" Value="Bold" /> 
      <Setter Property="Background" Value="Wheat" /> 
     </Style> 
    </DataGrid.RowStyle> 
</DataGrid> 

Наконец, вы могли установили RowStyle в GridStyle1, а затем явно задайте RowStyle на конкретных сетках в определенных окнах, как указано выше. Это сработает. Вы также могли бы создать новый стиль DataGrid в окне1.xaml (на основе GridStyle1), который установил RowStyle на что-то еще.