【问题标题】:Why does WPF not resize column that is set to auto width after a row is added?为什么 WPF 在添加行后不调整设置为自动宽度的列的大小?
【发布时间】:2023-03-20 21:04:01
【问题描述】:

我试图弄清楚为什么我在 WPF 中创建的数据网格中的最后一列在添加记录后没有适当地调整大小。相反,模板列中只有一个按钮是部分可见的。由于该列设置为自动宽度,我希望这会调整第一列(星形列)的大小以适合窗口中最后一列的内容。

谁能告诉我这里哪里出错了?附带说明一下,如果我之后调整窗口(而不是列)的大小,该列现在会显示所有模板列内容。

如果这正是 WPF 的工作方式,有没有办法让列重新计算为添加第一行后设置的自动/星号值?

这是一个简化示例中的问题的再现,所以不,这当然不是我的实际代码,我通常不会在后面的代码中编码。

后面的代码:

  public partial class MainWindow : Window
    {
        ObservableCollection<Test> TestCollection;
        public ICollectionView GridView { get; set;}
        public MainWindow()
        {
            
            InitializeComponent();
            this.DataContext = this;
            TestCollection = new ObservableCollection<Test>();
            GridView = CollectionViewSource.GetDefaultView(TestCollection);
      
        }

        private void TestButton_Click(object sender, RoutedEventArgs e)
        {
            TestCollection.Add(new Test { Field1 = "Test", Field2 = "Test", Field3 = "Test", Field4 = "Test" });
            GridView.Refresh();
        }
    }

    public class Test
    {
        public string Field1 { get; set; }
        public string Field2 { get; set; }
        public string Field3 { get; set; }
        public string Field4 { get; set; }
    }
}

XAML:

<Window x:Class="WpfApp4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp4"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="400">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Button Grid.Row="0" x:Name="TestButton" Click="TestButton_Click"/>
        <DataGrid Grid.Row="1" ItemsSource="{Binding GridView}" AutoGenerateColumns="False" CanUserAddRows="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Field1" Width="*" Binding="{Binding Field1}"/>
                <DataGridTextColumn Header="Field2" Width="Auto" Binding="{Binding Field1}"/>
                <DataGridTextColumn Header="Field3" Width="Auto" Binding="{Binding Field1}"/>
                <DataGridTextColumn Header="Field4" Width="Auto" Binding="{Binding Field1}"/>
                <DataGridTemplateColumn Header="Options">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="Auto"/>

                                </Grid.ColumnDefinitions>
                                <Button Grid.Column="0" Content="Test Button"/>
                                <Button Grid.Column="1" Content="Test Button 2"/>
                            </Grid>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                    <DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="Auto"/>

                                </Grid.ColumnDefinitions>
                                <Button Grid.Column="0" Content="Test Button"/>
                                <Button Grid.Column="1" Content="Test Button 2"/>
                            </Grid>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellEditingTemplate>
                </DataGridTemplateColumn>




            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

【问题讨论】:

  • 您没有做错任何事情,只是该列是空的,因此自动宽度与列标题的宽度一致。您可以在此视图后面添加代码: [NameOfYourDataGrid].Columns[4].Width=CurrentWidthJustFixed; [NameOfYourDataGrid].Columns[4].Width=GridLength.Auto;集合更改后。
  • 像这样将宽度设置为 *:Width="*"

标签: c# wpf xaml datagrid


【解决方案1】:

我找到了一些方法来解决这个问题:

1.在 DataGrid 的 Loaded 事件中设置 CanUserAddRows,而不是在 XAML 中设置

private void Grid1_Loaded(object sender, RoutedEventArgs e)
{
            Grid1.CanUserAddRows = false;
}

注意:为此,InitializeComponent() 必须在集合初始化后调用

  1. 遍历所有以 Star 为宽度的列,并将宽度设置为实际宽度,然后返回。

    private void TestButton_Click(object sender, RoutedEventArgs e)
    {
        TestCollection.Add(new Test { Field1 = "Test", Field2 = "Test", Field3 = "Test", Field4 = "Test" });
        GridView.Refresh();
    
        foreach (var Column in Grid1.Columns.Where(b => b.Width.IsStar))
        {
            Column.Width = new DataGridLength(1, DataGridLengthUnitType.Auto);
            Grid1.UpdateLayout();
            Column.Width = new DataGridLength(1, DataGridLengthUnitType.Star);
            Grid1.UpdateLayout();
        }
    
    }
    

【讨论】:

    【解决方案2】:

    不确定问题的根本原因,但是在按钮单击事件中再次将列的宽度设置为自动解决了问题。我给 datagrid 控件命名为“dataGrid”

    private void TestButton_Click(object sender, RoutedEventArgs e)
    {
        TestCollection.Add(new Test { Field1 = "Test", Field2 = "Test", Field3 = "Test", Field4 = "Test" });
        GridView.Refresh();
        dataGrid.Columns[4].Width = new DataGridLength(1,DataGridLengthUnitType.Auto);
    }
    

    【讨论】:

    • 嗯 - 这对我不起作用......不知道为什么。不过我确实找到了解决方案。
    • 哦,我明白了,没问题。很高兴您能够找到解决方案。如果可能的话,您可以在这里发布解决方案,以便它可以帮助将来可能遇到类似问题的人:)
    • 我在下面的单独答案中发布了一些我在下面找到的解决方案。
    猜你喜欢
    • 2017-08-25
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    相关资源
    最近更新 更多