代码之家  ›  专栏  ›  技术社区  ›  devuxer

当从.NET 3.5 w/wpf工具包升级到.NET 4.0时,为什么我的DataGrid样式会中断?

  •  0
  • devuxer  · 技术社区  · 14 年前

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

    我现在使用.NET 4.0 DataGrid 控件而不是WPF工具包 数据报ID 控制。从功能上讲,一切仍在工作,但我的风格没有按预期应用。

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


    之前(WPF工具包数据报)

    Screen capture of WPF Toolkit DataGrid

    在(.NET 4.0 DataGrid)之后

    Screen capture of .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>
    

    注释

    为了确保资源字典真正被使用,我将以下setter添加到 <Style TargetType="DataGrid">...</Style> :

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

    从下面的屏幕截图中可以看到,字体太大了,样式本身绝对不会被忽略。问题是许多设置由于某种原因未被使用或不起作用。

    alt text


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

    1 回复  |  直到 14 年前
        1
  •  1
  •   Community CDub    8 年前

    我想我找到了罪犯。在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主题,则自定义样式将正确应用(尽管在Windows XP上运行此样式后,它将丢失其Aero外观)。不过,这个问题在WPF 3.5中肯定没有发生。我不确定.NET 3.5和4.0之间到底发生了什么变化,这会导致失败。

    现在我只想知道如何获得航空主题 习惯 数据报ID 同时工作的样式:)

    编辑

    请看 this followup question .