Похоже, вы хотите применить глобальный стиль к каждому DataGridRow
в каждый DataGrid
в нескольких окнах, а также вы хотите применить дополнительно стилизация до DataGridRow
в одном или нескольких DataGrid
s в одном конкретном окне.
Если вы узнали CSS раньше, вы можете ожидать, таблицы стилей кумулятивные: В CSS, если применить tr.style1
глобально и локально tr.style2
, вы получаете как с tr.style2
выигравшей жеребьевку в любых случаях, когда они устанавливают один и тот же атрибут ,
Это не то, как стили работают в XAML. В XAML элемент может наследовать стиль от своего родителя, но он может иметь не более одного Style
. Кроме того, как вы нашли, Style
имеет свойство BasedOn
. Вы можете основывать один стиль на другом и получать кумулятивные эффекты обоих.
Наконец, существует несколько способов применения стиля. Вы обнаружили, что можете применить их к каждому элементу данного типа в заданной области.
К сожалению, поскольку все зависит от контекста, способ применения стилей XAML может быть очень запутанным сначала (а во-вторых, а иногда и третьим). Особенно, когда вы используете один стиль (GridStyle1
), чтобы применить другой стиль. Не всегда очевидно, что переопределяет то, что.
Лучше всего держать все как можно проще. Мы избавимся от этого набора RowStyle
, потому что он нам не нужен. Мы просто создадим глобальный DataGridRow
Style
, который применяется по умолчанию к каждому 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
на что-то еще.
Если вы на самом деле применяете 'GridStyle1' к вашему' DataGrid', то этот стиль устанавливает стиль для DataGridRow' в этом 'DataGrid', и стиль по умолчанию, который вы создали, конечно, игнорируется. Появляются ли ваши данные DataGridRow с голубым фоном? Попробуйте добавить тот же атрибут 'BasedOn' к стилю, который устанавливает голубой фон. Вероятно, это тот, который используется. Могут возникнуть другие проблемы, но сначала попробуйте это. –
Я пробовал добавить тот же атрибут BaseOn к голубому фону, но он бесполезен, тот же результат я получаю (применяется голубой фон, но FontStyle не курсив). –
Вы добавили fontstyle к этому? –