* width的XAML Datagrid列自动缩小到最小宽度

时间:2016-10-19 00:00:34

标签: wpf xaml

我在XAML中有一个数据网格,有4个单独的列,所有列的宽度均为*。在带有控件的Visual Studio中,一切看起来都很好,在设计视图中一切都很好。

然而,当我运行我的程序时,我的所有列都缩小到只有5个左右宽度的像素,没有任何内容,甚至没有点击并拖动列的边框来调整它们的宽度也会改变它们的宽度。偶尔当我运行我的程序时,我甚至看到列以正常宽度开始,然后在几秒钟内一次缩小到最小尺寸一个像素。

经过一些调查,似乎该问题与使用*作为列的宽度有某种关系,就像我将所有列更改为Auto或固定宽度一切正常该专栏由于某种原因。

以下是我遇到问题的XAML代码。

<GroupBox Header="header text" Margin="4"
          Visibility="{Binding BindTarget, Converter={StaticResource BooleanToVisibilityConverter}}">
    <DataGrid Margin="4" ItemsSource="{Binding}" DataContext="{Binding DataContextTarget}"
              AutoGenerateColumns="False" MaxHeight="250" CanUserDeleteRows="False"
              EnableRowVirtualization="False" CanUserSortColumns="True" CanUserResizeColumns="True">
        <DataGrid.Columns>
            <DataGridTemplateColumn Width="0.8*">
        <DataGridTemplateColumn.Header>
        <TextBlock Text="ResourceHeader1" TextWrapping="Wrap" />
        </DataGridTemplateColumn.Header>

                <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <CheckBox
            IsChecked="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
            IsEnabled="True" />
    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn Width="*" IsReadOnly="True">
                <DataGridTemplateColumn.Header>
    <TextBlock Text="Name" TextWrapping="Wrap" />
                </DataGridTemplateColumn.Header>
                <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <TextBlock Text="{Binding FieldName1}" IsEnabled="True" />
    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn Width="*" IsReadOnly="True">
                <DataGridTemplateColumn.Header>
    <TextBlock Text="Model" TextWrapping="Wrap" />
                </DataGridTemplateColumn.Header>
                <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <TextBlock Text="{Binding FieldName2}" IsEnabled="True" />
    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn Width="*" IsReadOnly="True">
                <DataGridTemplateColumn.Header>
    <TextBlock Text="Manufacturer" TextWrapping="Wrap" />
                </DataGridTemplateColumn.Header>
                <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <TextBlock Text="{Binding FieldName3}" IsEnabled="True" />
    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</GroupBox>

正如您在XAML中看到的,我甚至允许用户手动调整数据网格中的列宽,但这并没有什么区别,如果我将宽度设置为{,则列仍然会拒绝调整大小{1}}。

任何想法会导致这个奇怪的问题?

2 个答案:

答案 0 :(得分:0)

在StackOverflow上做了一些搜索后,我找到了解决问题的方法,但我仍然不知道是什么原因引起了我的问题。

Nested Scroll Areas

在上面的链接线程中查看Daniel的回答,将我的Datagrid包装在他的RestrictDesiredSize类中,并给它一个最小高度和宽度,如下所示修复了我的问题。

<local:RestrictDesiredSize MinHeight="50" MinWidth="200">
    <!-- Datagrid XAML goes here -->
</local:RestrictDesiredSize>

答案 1 :(得分:0)

数据网格不在面板中,因此当它自我测量时,它将占用尽可能少的空间,同时仍然绘制其子节点。由于您的列需要*,因此每个列都会获得该最小空间的一部分。宽度为*的事物的默认所需大小是0和MinWidth中的较大值,因此您的列会被缩小到最小宽度。如果将DataGrid放入Grid或其他面板中,DataGrid将填充面板的空间,并且每列将获得DataGrid空间的比例量。如果在DataGrid上设置Width或MinWidth,也会发生这种情况。

当您将列宽设置为auto时,它们将占用所需的空间,并且当数据网格自行测量时,它将包含所有列的所需大小作为其自身所需大小的一部分。数据网格将增长以容纳列。