【问题标题】:Resize columns to fits DataGrid in WPF dynamically动态调整列大小以适应 WPF 中的 DataGrid
【发布时间】:2021-11-10 12:58:15
【问题描述】:

我有代码在 Grid 列中动态添加自定义 DataGrid 对象,例如:

DataGrid dg = new DataGrid();
var vm = new MyViewModel();
dg.DataContext = vm;
dg.ItemsSource = vm.Items;

dg.VerticalAlignment = VerticalAlignment.Stretch;
dg.HorizontalAlignment = HorizontalAlignment.Stretch;

dg.AutoGenerateColumns = false;
dg.CanUserAddRows = false;
dg.CanUserResizeColumns = true;

dg.Columns.Clear();

dg.Columns.Add(new DataGridTextColumn
{
                Header = "Name",
                Binding = new Binding(nameof(DataItem.Path)) { Converter = new PathToNameConverter() },
                //Width = DataGridLength.Auto
});
...

// here add column definition to Grid
var gridColDefs = new ColumnDefinition();
gridColDefs.Width = GridLength.Auto;
gridColDefs.MinWidth = 500;

gridElement.ColumnDefinitions.Add(gridColDefs);
Grid.SetColumn(dg, gridElement.ColumnDefinitions.Count - 1);
gridElement.Children.Add(dg);

// populate datagrid items (I use Items => ObservableCollection<>)
await vm.FetchItemsAsync();

var star = new DataGridLength(1, DataGridLengthUnitType.Star);
dg.ColumnWidth = star;
foreach (var col in dg.Columns)
{
    col.Width = star;
}

dg.SelectionMode = DataGridSelectionMode.Extended;

DataGrid 中填充项目后,列未填充到整个 DataGrid 宽度,如图所示保留一个空格:

我想要的是将所有列填充到它的 DataGrid 空间......我不知道我的错误在哪里

更新

Items = new ObservableCollection<DataItem>();

public override Task FetchItemsAsync(string path = null)
{
            if (string.IsNullOrWhiteSpace(path))
            {
                return Task.Run(() =>
                {
                    var mainDrive = Path.GetPathRoot(Environment.GetFolderPath(Environment.SpecialFolder.System));
                    App.Current.Dispatcher.Invoke(() => Items.Clear());

                    var folders = Directory.GetDirectories(mainDrive);
                    var files = Directory.GetFiles(mainDrive);

                    foreach (var item in folders.Union(files))
                    {
                        var isDir = FolderUtility.IsFolder(item);
                        FileSystemInfo fs = null;
                        if (isDir)
                        {
                            fs = new DirectoryInfo(item);
                        }
                        else
                        {
                            fs = new FileInfo(item);
                        }

                        App.Current.Dispatcher.Invoke(() =>
                        {
                            try
                            {
                                Items.Add(new DataItem
                                {
                                    Path = item,
                                    Size = isDir ? FolderUtility.GetFolderSize(item) : new FileInfo(item).Length,
                                    LastModifiedDate = fs.LastWriteTimeUtc,
                                    CreationDate = fs.CreationTimeUtc
                                });
                            }
                            catch { }
                            finally { }
                        });
                    }
                });
            }

            return null;
}

** 更新 2 ** 如果我使用

Width = new DataGridLength(1, DataGridLengthUnitType.Star)

对于每一列,在await 声明之后,我得到:

XAML:

<Window ...>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <DockPanel x:Name="AppContentPanel" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto">
        <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
            <Grid>
                <Grid.ColumnDefinitions/>
            </Grid>
        </ScrollViewer>
    </DockPanel>
</Grid>

【问题讨论】:

  • 是的,我想填满整个 DataGrid 空间
  • 然后将Width 属性设置为“*”。看我的回答。
  • Width谁?
  • 每个DataGridColumn.

标签: c# wpf datagrid


【解决方案1】:

如果您希望列将DataGrid 平分,可以将它们的Width 属性设置为“*”:

Width = new DataGridLength(1, DataGridLengthUnitType.Star);

编辑:

您还需要删除gridColDefs.Width = GridLength.Auto; 并将ScrollViewerHorizontalScrollBarVisibility 属性设置为Disabled,以便DataGrid 按预期拉伸。

【讨论】:

  • 我在dg.Columns.Add( ... , Width = new DataGridLength(1, DataGridLengthUnitType.Star)) 中尝试过,但最糟糕的是,在填充数据之前列的宽度非常小
  • 我已经做了,看我的帖子,我在 await FetchAsync 之后做了
  • 查看更新后的帖子
  • 为什么列“在填充数据之前宽度非常小”?应该填充DataGrid 的空间。如果他们不这样做,那么您将DataGrid 放入了错误的Panel 或以某种方式弄乱了它的Width
  • 如果:dg.Width=gridColDef.ActualWidth 在 await 语句之后似乎会起作用
猜你喜欢
  • 2011-11-20
  • 2011-08-20
  • 1970-01-01
  • 2016-01-22
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
  • 1970-01-01
相关资源
最近更新 更多