【问题标题】:Why did my DataGrid styling break when upgrading from .NET 3.5 w/ WPF Toolkit to .NET 4.0?从 .NET 3.5 w/ WPF Toolkit 升级到 .NET 4.0 时,为什么我的 DataGrid 样式会中断?
【发布时间】:2011-05-13 06:20:30
【问题描述】:

我刚刚将一个 WPF 项目从 .NET 3.5 转换为 .NET 4.0。

我现在使用 .NET 4.0 DataGrid 控件而不是 WPF Toolkit DataGrid 控件。从功能上讲,一切仍然正常,但我的样式没有按预期应用。

从下面的屏幕截图中可以看出,交替行格式、填充、粗体标题等已停止工作。


之前(WPF 工具包数据网格)

之后(.NET 4.0 DataGrid)


这是我的整个资源字典。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style x:Key="DataGrid_ColumnHeaderStyle" TargetType="DataGridColumnHeader">
        <Setter Property="FontWeight" Value="Bold" />
        <Setter Property="TextBlock.TextAlignment" Value="Center" />
        <Setter Property="TextBlock.TextWrapping" Value="WrapWithOverflow" />
    </Style>
    <Style x:Key="DataGrid_CellStyle" TargetType="DataGridCell">
        <Setter Property="Padding" Value="5,5,5,5" />
        <Setter Property="TextBlock.TextAlignment" Value="Center" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="DataGridCell">
                    <Border Padding="{TemplateBinding Padding}" Background="{TemplateBinding Background}">
                        <ContentPresenter />
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <Style TargetType="DataGrid">
        <Setter Property="ColumnHeaderStyle" Value="{StaticResource DataGrid_ColumnHeaderStyle}" />
        <Setter Property="CellStyle" Value="{StaticResource DataGrid_CellStyle}" />
        <Setter Property="Background" Value="White" />
        <Setter Property="AlternatingRowBackground" Value="#F0F0F0" />
        <Setter Property="VerticalGridLinesBrush" Value="LightGray" />
        <Setter Property="HeadersVisibility" Value="Column" />
        <Setter Property="SelectionMode" Value="Single" />
        <Setter Property="SelectionUnit" Value="FullRow" />
        <Setter Property="GridLinesVisibility" Value="Vertical" />
        <Setter Property="AutoGenerateColumns" Value="False" />
        <Setter Property="CanUserAddRows" Value="False" />
        <Setter Property="CanUserDeleteRows" Value="False" />
        <Setter Property="CanUserReorderColumns" Value="True" />
        <Setter Property="CanUserResizeColumns" Value="True" />
        <Setter Property="CanUserResizeRows" Value="False" />
        <Setter Property="CanUserSortColumns" Value="True" />
        <Setter Property="IsReadOnly" Value="True" />
        <Setter Property="BorderBrush" Value="#DDDDDD" />
        <Setter Property="HorizontalGridLinesBrush" Value="#DDDDDD" />
        <Setter Property="VerticalGridLinesBrush" Value="#DDDDDD" />
    </Style>
    <Style x:Key="DataGrid_FixedStyle" TargetType="DataGrid" BasedOn="{StaticResource {x:Type DataGrid}}">
        <Setter Property="CanUserReorderColumns" Value="False" />
        <Setter Property="CanUserResizeColumns" Value="False" />
        <Setter Property="CanUserResizeRows" Value="False" />
        <Setter Property="CanUserSortColumns" Value="False" />
    </Style>
</ResourceDictionary>

这里是一个用法示例(注意样式设置为“DataGrid_FixedStyle”):

<DataGrid
    Style="{StaticResource DataGrid_FixedStyle}"
    Grid.Column="0" Foreground="Black"
    SelectedIndex="{Binding SelectedParticipantIndex, Mode=TwoWay}"
    ItemsSource="{Binding Participants}">
    <DataGrid.Columns>
        <DataGridTextColumn Foreground="Black" Header="Participant" Binding="{Binding ParticipantId}" />
        ....
    </DataGrid.Columns>
</DataGrid>

注意

为了确保资源字典真正被使用,我将以下设置器添加到&lt;Style TargetType="DataGrid"&gt;...&lt;/Style&gt;

<Setter Property="FontSize" Value="24" />

从下面的屏幕截图中可以看出,字体大小非常卡通,因此样式本身绝对不会被忽视。问题是许多设置由于某种原因没有被使用或不起作用。


关于什么可能导致我的风格崩溃的任何理论?

【问题讨论】:

  • 我刚刚尝试将您的 ResourceDictionary 的内容放入 Window.Resources 与您的 DataGrid 示例相同的文件中,并且效果很好。您如何包含您的 ResourceDictionary?
  • @Colin,奇怪,不管我把资源字典放在哪里,它都对我不起作用。
  • 您是否尝试在基本样式上设置 x:Key 以进行故障排除? 。
  • @Meleak,是的,我确实尝试过。它没有任何区别。请在下面查看我的答案。

标签: wpf xaml datagrid wpftoolkit


【解决方案1】:

我想我找到了罪魁祸首。在我的 App.xaml 中,我使用以下声明应用“Aero”主题:

<ResourceDictionary
    Source="/PresentationFramework.Aero,
    Version=3.0.0.0,
    Culture=neutral,
    PublicKeyToken=31bf3856ad364e35,
    ProcessorArchitecture=MSIL;component/themes/aero.normalcolor.xaml" />

之后,我使用以下声明包含在 DataGrid 上执行附加样式的资源字典:

<ResourceDictionary
    Source="/CommonLibraryWpf;component/ResourceDictionaries/DataGridResourceDictionary.xaml" />

如果我删除 Aero 主题,自定义样式会正确应用(尽管它失去了 Aero 外观,因为我在 Windows XP 上运行它)。不过,这个问题绝对不会在 WPF 3.5 中出现。我不确定 .NET 3.5 和 4.0 之间究竟发生了什么变化会导致失败。

现在我只需要弄清楚如何让 Aero 主题自定义 DataGrid 样式同时工作:)

编辑

请参阅this followup question

【讨论】:

    猜你喜欢
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 2010-09-08
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多