我有WPF应用程序,我在App.xaml中创建了DataGrid样式以应用整个应用程序。
的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 :(得分:0)
您希望在多个窗口中的每个DataGridRow
中为每个DataGrid
应用全局样式,并且还希望将其他样式应用于{{1在一个特定窗口中的一个或多个DataGridRow
中。
如果你以前学过CSS,你可能会认为样式表是累积的:在CSS中,如果你在本地应用DataGrid
而在本地应用tr.style1
,你可以获得两者,tr.style2
获胜在他们设置相同属性的任何情况下投掷。
这不是样式在XAML中的工作方式。在XAML中,元素可以从其父级继承样式,但它最多只能有一个tr.style2
。此外,正如您所发现的,Style
具有Style
属性。您可以将一种风格基于另一种风格,并获得两者的累积效果。
最后,有几种方法可以应用样式。您已经发现可以将它们应用于给定范围内给定类型的每个元素。
不幸的是,因为一切都取决于上下文,所以XAML样式的应用方式起初可能非常混乱(第二次,有时是第三次)。特别是当您使用一种样式(BasedOn
)来应用另一种样式时。并不总是很明显是什么覆盖了什么。
最好让事情尽可能简单。我们将摆脱那个GridStyle1
setter,因为我们不需要它。我们将创建一个全局RowStyle
DataGridRow
,默认情况下适用于每个Style
,然后我们将在window1.xaml中专门覆盖它。
<强>的App.xaml 强>
DataGridRow
<强> window1.xaml 强>
<Application.Resources>
<Style TargetType="DataGridRow" BasedOn="{StaticResource {x:Type DataGridRow}}">
<Setter Property="Background" Value="Cyan" />
</Style>
</Application.Resources>
这将适用于该窗口中的每个<Window.Resources>
<Style TargetType="DataGridRow" BasedOn="{StaticResource {x:Type DataGridRow}}">
<Setter Property="FontStyle" Value="Italic" />
</Style>
</Window.Resources>
。 DataGridRow
属性将引用任何包含上下文中已为BasedOn
定义的样式 - 通常,这意味着App.xaml,如果我们不添加任何其他内容,那将是是这样的。
这与您所拥有的不同之处在于您以不同的方式应用了青色DataGridRow
样式:您在App.xaml中应用的Background
样式是通过{{1}应用的你的DataGridRow
风格的setter。该格式为RowStyle
WPF预先存在的DataGrid
默认BasedOn
,然后强制应用于使用{{Style
的每个DataGridRow
中的每个DataGridRow
1}}风格。
如果DataGrid
中尚未设置GridStyle1
,则您在window1.xaml 中定义的DataGridRow
样式将应用。
但正如我们所见,您不需要使用DataGrid.RowStyle
将样式全局应用于每个GridStyle1
。您可以使用该类型的默认样式执行此操作,如上面的App.xaml片段中所示。 RowStyle
对于单独覆盖某个特定DataGridRow
上的全局DataGrid.RowStyle
样式非常有用。但你不想在全球范围内这样做!因此,App.xaml中的样式应如下所示:
<强>的App.xaml 强>
DataGridRow
再次,这是 window1.xaml
中的DataGrid
<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
中的所有文字都显示为斜体,但这也会更改标题,因此我认为这不是您想要的:
<Style TargetType="DataGridRow" BasedOn="{StaticResource {x:Type DataGridRow}}">
<Setter Property="FontStyle" Value="Italic" />
</Style>
如果你想在window1.xaml中的一个网格上应用DataGrid
样式,这里是如何做到的。如果我们向<DataGrid
FontStyle="Italic"
/>
添加Italic
属性,则不会将其应用于范围内的每个x:Key
。相反,它只是坐在那里,等待名称用作Style
。
<强> window1.xaml 强>
DataGridRow
这是另一种将样式应用于window1.xaml中仅一个网格中的行的方法:
StaticResource
最后,您可以在<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"
/>
中设置<!-- 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
,如上所述。那会有用。您还可以在window1.xaml(基于GridStyle1
)中创建一个新的RowStyle
样式,该样式将DataGrid
设置为其他内容。