【问题标题】:How to override a datagrid style如何覆盖数据网格样式
【发布时间】:2016-11-10 20:54:01
【问题描述】:

我有一个样式化的窗口,我想将一个数据网格样式覆盖到我的应用程序中的所有数据网格

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

我认为这必须有效,但我必须申请

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

现在我不想将其应用于所有 dtgs。 最好是在 xaml 中自动应用它。

感谢

---为ASh添加----

感谢您的帮助。唯一的问题是,当数据网格失去焦点时,数据网格中的选定行会改变颜色,如下图所示(前景变为黑色)。

我尝试添加各种属性,但没有任何效果。

此外,左边框变得更粗(不是双关语)和更大。 知道如何解决吗? 谢谢

【问题讨论】:

  • TargetType="{x:Type DataGridRow}"。它是 DataGridRow 样式,而不是 DataGrid。它应该默认应用,因为没有显式键
  • Thanx 所以我将 DatagridRow 名称更改为 dtrStyle 并添加了 但是现在如何添加合适的样式呢?
  • @Patrick 你设置TargetType="{x:Type DataGridRow}"的方式,你可以设置为DataGrid。有什么大不了的?你想达到什么目标?

标签: c# wpf datagrid styles


【解决方案1】:

如果您需要 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)

【讨论】:

  • 感谢您帮助 ASh,请查看我的小(迟来的)编辑。
  • @Patrick,我用前景修复更新了我的答案。我还用放大镜查看了屏幕截图。标题实际上并没有改变它的大小,只有颜色
  • 工作就像一个魅力thanx!
猜你喜欢
  • 2019-03-10
  • 1970-01-01
  • 2015-06-22
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 2019-02-17
相关资源
最近更新 更多