c# - 动态调整列大小以适应 WPF 中的 DataGrid
问题描述
我有代码在 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 = new DataGridLength(1, DataGridLengthUnitType.Star);
编辑:
您还需要删除gridColDefs.Width = GridLength.Auto;
并将 的 HorizontalScrollBarVisibility
属性设置为ScrollViewer
以按预期拉伸。Disabled
DataGrid
推荐阅读
- php - Laravel 从 url 获取参数
- c# - 如何在 WinForms 应用程序中使用 Auth0 刷新令牌
- css - 无法在 Vue.js 中将页脚粘贴到底部
- javascript - 如何清除 Nx 缓存
- laravel - Laravel Backpack CRUDController 返回 redirect() 或跳过中间件运行 redirect()
- php - WooCommerce:排序问题:选择的 orderby 值覆盖过滤器值
- google-sheets-formula - 在 Google 表格中查询行和列的总计
- python - 如何将烧瓶中的 reqParser 转换为 python 中的 faspapi?
- java - 一个用于一元和双向流的 grpc 服务器,带有 netty
- node.js - 如何在快速验证器中验证对象数组