尝试将多个样式应用于DataGridRow

时间:2016-03-30 19:01:38

标签: c# wpf

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

窗口样式不适用的问题(字体样式不是斜体)

1 个答案:

答案 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设置为其他内容。