【问题标题】:WPF DataGrid column ignores WidthWPF DataGrid 列忽略宽度
【发布时间】:2012-06-06 15:44:09
【问题描述】:

我有 2 个数据网格。为了让它们漂亮,我对它们做了一些造型。我定义了 CellTemplate 和 HeaderTemplate 并将它们以隐式样式应用于 DataGrid。我在 XAML 中添加列并保留它们。他们也有 HeaderTemplates。

编辑: 我已经尝试了其他一些场景,所以这里有更多关于发生了什么:

DataGrid 'A' 工作正常。它完全从 XAML 启动。它接受各种宽度(包括星号)并正确显示。它被放置在具有 VM 的 UserControl 中。这是 XAML:

<DataGrid ItemsSource="{Binding Items}">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Name}" Header="Name" MinWidth="50" Width="250" HeaderTemplate="{StaticResource DefaultDataGridHeader}"/>
        <DataGridTextColumn Binding="{Binding StartDate}" Header="Start"  MinWidth="50" Width="150" HeaderTemplate="{StaticResource DefaultDataGridHeader}" />
        <DataGridTextColumn Binding="{Binding FinishDate}" Header="Finish"  MinWidth="50" Width="150" HeaderTemplate="{StaticResource DefaultDataGridHeader}" />
        <DataGridTextColumn Binding="{Binding Leader}" Header="Leader"  MinWidth="50" Width="*" HeaderTemplate="{StaticResource DefaultDataGridHeader}" />
    </DataGrid.Columns>
</DataGrid>

然后是DataGrid B...

现在有点复杂。有一个显示 DataGrid B 并执行其他操作的控件。它用于许多其他视图,具有不同的数据。因此,对于每个数据,都有另一个视图,其中包含 DataGrid 列。当数据到达主控件时,它会清除 DataGrid B 的列并使用相应视图中定义的列重新填充它。

这是用户控件中的 DataGrid B:

<DataGrid x:Name="datagrid" ItemsSource="{Binding Items}" IsReadOnly="True"  SelectionMode="Single" />

UserControl 有一个 ObservableCollection GridColumns DependencyProp。这是实际的 DataGridColumns 到达的地方。所以在 CollectionChanged 事件中我这样做:

void GridColumnsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    datagrid.Columns.Clear();
    foreach (var gridColumn in GridColumns)
    {
        datagrid.Columns.Add(gridColumn);
    }
}

这是我如何在数据特定视图中设置实际列的示例:

<c:GenericList >
    <c:GenericList.GridColumns>
            <DataGridTextColumn Binding="{Binding Name}" Header="Name" 
            Width="300" HeaderTemplate="{StaticResource DefaultDataGridHeader}"/>
    </c:GenericList.GridColumns>
</c:GenericList>

-------- DataGrid B 会发生什么:--------

  • 如果我这样保留 XAML,则该列将以 300 像素的宽度呈现。
  • 如果我将宽度更改为星形大小,或添加任何其他星形大小的列,它们会以 20 像素宽度呈现。 (即使标题中有一些文字)
  • 如果我设置了 MinWidth,那么所有星形大小的列都使用 MinWidth 进行渲染。

  • 如果我省略整个“从另一个视图放置列”部分,并添加一些列 直接到数据网格,然后像素大小的列跨越到标题文本的宽度,星形大小的列以 20px 宽度呈现。此外,如果我在正在运行的应用程序中调整星形列的大小,则会出现一些宽度限制,我无法再使列变小。 - 但在这个版本中,没有数据可以绑定到列。会不会造成这种影响?

//编辑结束。

样式是在 Blend 中使用“编辑副本”功能制作的。

他们是这样的:

<Style x:Key="DefaultDataGridColumnHeaderStyle" TargetType="{x:Type DataGridColumnHeader}">
    <Setter Property="VerticalContentAlignment" Value="Center"/>
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
                <Grid >
                    <Microsoft_Windows_Themes:DataGridHeaderBorder BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" 
                                                                   IsClickable="{TemplateBinding CanUserSort}" IsPressed="{TemplateBinding IsPressed}" IsHovered="{TemplateBinding IsMouseOver}" 
                                                                   Padding="{TemplateBinding Padding}" SortDirection="{TemplateBinding SortDirection}" SeparatorBrush="{TemplateBinding SeparatorBrush}" 
                                                                   SeparatorVisibility="{TemplateBinding SeparatorVisibility}" Background="#00000000">
                        <Grid>
                            <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
                                              VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                            <Rectangle StrokeThickness="0" RadiusY="0" Opacity="0">
                                <Rectangle.Fill>
                                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                        <GradientStop Color="#33000000" Offset="1"/>
                                        <GradientStop Color="#4CFFFFFF"/>
                                        <GradientStop Color="#007B7B7B" Offset="0.35"/>
                                    </LinearGradientBrush>
                                </Rectangle.Fill>
                            </Rectangle>
                        </Grid>
                    </Microsoft_Windows_Themes:DataGridHeaderBorder>
                    <Thumb x:Name="PART_LeftHeaderGripper" HorizontalAlignment="Left" Style="{StaticResource ColumnHeaderGripperStyle}" Width="8"/>
                    <Thumb x:Name="PART_RightHeaderGripper" HorizontalAlignment="Right" Style="{StaticResource ColumnHeaderGripperStyle}" Width="8"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<DataTemplate x:Key="DefaultDataGridHeader">
    <Border BorderBrush="{DynamicResource ShadowBrush}" Background="{x:Null}" d:DesignWidth="289" d:DesignHeight="72.28">
        <Grid>
            <Rectangle RadiusY="0" StrokeThickness="0" Fill="{DynamicResource ActionTileBrush}" />
            <Rectangle RadiusY="0" StrokeThickness="0" >
                <Rectangle.Fill>
                    <SolidColorBrush Color="#88FFFFFF" />
                </Rectangle.Fill>
            </Rectangle>
            <TextBlock Text="{Binding}" Margin="12" FontSize="16" FontWeight="Bold">
                <TextBlock.Foreground>
                    <SolidColorBrush Color="#FF11789D" />
                </TextBlock.Foreground>
            </TextBlock>
            <Rectangle RadiusY="0" StrokeThickness="1" Stroke="{DynamicResource ShadowBrush}"></Rectangle>
        </Grid>
    </Border>
</DataTemplate>


<Style x:Key="DefaultDataGridCellStyle" TargetType="{x:Type DataGridCell}">
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="BorderBrush" Value="Transparent"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridCell}">
                <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True" Padding="12,8">
                    <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Background" Value="{DynamicResource HighlightBrush}"/>
        </Trigger>
        <Trigger Property="IsKeyboardFocusWithin" Value="True">
            <Setter Property="BorderBrush" Value="{DynamicResource HighlightBrush}"/>
        </Trigger>
    </Style.Triggers>
</Style>



<Style x:Key="DefaultDataGridStyle" TargetType="{x:Type DataGrid}">
    <Setter Property="AlternatingRowBackground" Value="{x:Null}"/>
    <Setter Property="AlternationCount" Value="2"/>
    <Setter Property="AutoGenerateColumns" Value="False"/>
    <Setter Property="Background" Value="{x:Null}"/>
    <Setter Property="BorderBrush" Value="{DynamicResource ChromeBrush}"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="CellStyle" Value="{StaticResource DefaultDataGridCellStyle}"/>
    <Setter Property="ColumnHeaderStyle" Value="{StaticResource DefaultDataGridColumnHeaderStyle}"/>
    <Setter Property="Foreground" Value="{DynamicResource ForegroundBrush}"/>
    <Setter Property="HorizontalGridLinesBrush" Value="{DynamicResource ShadowBrush}"/>
    <Setter Property="RowBackground" Value="{DynamicResource BackgroundBrush}"/>
    <Setter Property="RowDetailsVisibilityMode" Value="VisibleWhenSelected"/>
    <Setter Property="ScrollViewer.CanContentScroll" Value="true"/>
    <Setter Property="ScrollViewer.PanningMode" Value="Both"/>
    <Setter Property="Stylus.IsFlicksEnabled" Value="True"/>
    <Setter Property="VerticalGridLinesBrush" Value="{DynamicResource ShadowBrush}"/>
    <Setter Property="VerticalContentAlignment" Value="Stretch"/>
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
    <Style.Triggers>
        <Trigger Property="IsGrouping" Value="true">
            <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
        </Trigger>
    </Style.Triggers>
</Style>

显然某处有问题,我应该能够将列设置为星形大小,或者如果将它们设置为像素大小,我希望它们保持不变。

感谢您的帮助!

【问题讨论】:

  • 我认为网格的大小不正确。请发布大小正确的网格的 xaml。
  • 其他的我没贴,因为一模一样,只是用了其他的Bindings。
  • 好的,我又搞砸了他们,并更新了问题,所以上面有更多信息。

标签: wpf templates datagrid styles


【解决方案1】:

希望您的 xaml 中 BindingWidth 之间的第二个 DataGridTextColumn 中有空格

【讨论】:

  • 是的,这是一个复制粘贴错误,但它们在我的代码中是分开的。
【解决方案2】:

承载第二个数据网格的 UserControl 的 Horizo​​ntalAlignment 是否设置为 Stretch? 我会尝试将 UserControl 的 Horizo​​ntalAlignment 设置为 Stretch - 这可能会限制 DataGrid 的大小。

【讨论】:

    猜你喜欢
    • 2015-03-20
    • 2012-06-26
    • 1970-01-01
    • 2011-08-22
    • 2013-07-26
    • 2011-07-16
    • 2013-03-31
    • 1970-01-01
    • 2011-04-06
    相关资源
    最近更新 更多