【问题标题】:XAML Datagrid columns of * width automatically shrinks to minimum width* 宽度的 XAML Datagrid 列自动缩小到最小宽度
【发布时间】:2017-02-28 10:03:14
【问题描述】:

我在 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 中看到的,我什至允许用户手动调整数据网格中的列宽,但这并没有什么区别,如果我将列的宽度设置为 *,它们仍然拒绝调整大小.

任何想法是什么导致了这个奇怪的问题?

【问题讨论】:

  • 我将它复制到一个新的 WPF 窗口中,并且列间距没有任何问题。
  • 我已经尝试过这样做,它可能在 XAML 预览中显示得很好,但是我将我的数据网格 XAML 粘贴到的任何新控件/窗口都有相同的问题,即使它是唯一的事情在控制中。我尝试将我的数据网格复制并粘贴到我项目中的其他现有窗口中,同样的事情也发生在那里。我真的很想弄清楚这件事。

标签: wpf xaml


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    在 StackOverflow 上进行更多搜索后,我找到了解决问题的方法,但我仍然不知道最初是什么导致了我的问题。

    Nested Scroll Areas

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-02
      • 2014-12-08
      • 2019-08-21
      • 2013-05-14
      • 1970-01-01
      • 2012-05-08
      • 2011-10-18
      • 2014-10-31
      相关资源
      最近更新 更多