gpt4 book ai didi

WPF DataGrid 列忽略宽度

转载 作者:行者123 更新时间:2023-12-05 01:17:16 29 4
gpt4 key购买 nike

我有 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 并执行其他一些操作的控件。它用于许多其他 View ,具有不同的数据。因此对于每个数据都有另一个 View ,其中包含 DataGrid 列。当数据到达主控件时,它会清除 DataGrid B 的列并用相应 View 中定义的列重新填充它。

这是用户控件中的 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);
}
}

下面是我如何在特定于数据的 View 中设置实际列的示例:

<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 呈现。

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

//编辑结束。

样式是在 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>

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

感谢您的帮助!

最佳答案

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

关于WPF DataGrid 列忽略宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10849616/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com