使用Avalonia与C#清除DataGrid末尾空白列的问题排查
Avalonia DataGrid手动生成列后末尾空白区域问题
我正在创建一个通用类,用于在AutoGenerateColumns设为false时生成DataGrid列。目前所有功能已实现,但最后一列始终存在空白区域,无法移除。以下是相关代码:
View后台代码
_dataGridExtensions.BuildColumnTable<TargetClass>(DBDataGrid, "Historical Log Config");
表格构建扩展方法
public void BuildColumnTable<T>(CustomDataGrid? table, string tablename) { Type type = typeof(T); if (table == null) { _logger.Error("Unable to build @Table. Please inspect code to successfully build @Table table", new { Table = tablename }); return; } int cntloop = 0; foreach (var prop in type.GetProperties()) { var attr = prop.GetCustomAttribute<DataGridAttribute>(); if (attr == null || attr.Ignore) continue; if(attr.TargetType == DataGridColumnType.TextBox || attr.TargetType == DataGridColumnType.TextBlock) { if (attr.Marker) { var textCol = new DataGridTextColumn { Header = attr.ColumnName, Binding = new Binding(prop.Name) { Mode = BindingMode.OneWay, }, IsReadOnly = true, }; table.Table.Columns.Add(textCol); } else { var textCol = new DataGridTextColumn { Header = attr.ColumnName, Binding = new Binding(prop.Name) { Mode = BindingMode.OneWay, }, IsReadOnly = true, }; table.Table.Columns.Add(textCol); } } //if(cntloop <= type.GetProperties().Length-1) // table.Table.ColumnWidth = new DataGridLength(1, DataGridLengthUnitType.Star); //cntloop++; } //table.Table.ColumnWidth = new DataGridLength(1, DataGridLengthUnitType.Star); table.Table.InvalidateMeasure(); table.Table.InvalidateArrange(); table.Table.InvalidateVisual(); return; }
AXAML代码
<Datagrid:CustomDataGrid Grid.Row="0" x:Name="DBLogConfig" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" GridTableHeader="Historical Log Table" GridTableHeaderForeground="White" GridTableHeaderHorizontalContentAlignment="Center" GridTableHeaderVerticalContentAlignment="Center" GridTableBackground="LightGray" GridTableAutoGenerateColumns="True" GridTableItemSource="{Binding dbLogConfig, Mode=TwoWay}" GridTableSelectedItem="{Binding selectedLogConfig}" GridTableCornerRadius="5" GridTableBorderThickness="1" GridTableBorderBrush="Black" GridTableReadOnly="True" GridTableLinesVisibility="All" GridTableSelectionMode="Single" GridTableUserReorderColumns="False" GridTableUserResizeColumns="True" GridTableUserSortColumns="False" MaxWidth="{Binding ViewportWidth, ElementName=TabGrid}" MinWidth="300"/>
自定义DataGrid控件代码
<UserControl xmlns="https://github.com/avaloniaui" 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" mc:Ignorable="d" Background="Transparent" x:Class="BaseProject.Controls.DataGridTable.CustomDataGrid" Name="CustomDataGridTable"> <UserControl.Styles> <FluentTheme /> <StyleInclude Source="avares://Avalonia.Controls.DataGrid/Themes/Fluent.xaml"/> </UserControl.Styles> <Border x:Name="GridTableBoundary" Background="#54575c" CornerRadius="5"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <TextBox x:Name="GridHeader" Grid.Row="0" Text="{Binding GridTableHeader, ElementName=CustomDataGridTable, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Background="Transparent" Foreground="{Binding GridTableHeaderForeground, ElementName=CustomDataGridTable}" TextChanged="GridHeader_TextChanged" IsReadOnly="True" BorderThickness="0" IsEnabled="False" HorizontalAlignment="{Binding GridTableHeaderHorizontalAlignment, ElementName=CustomDataGridTable}" HorizontalContentAlignment="{Binding GridTableHeaderHorizontalContentAlignment, ElementName=CustomDataGridTable}" VerticalAlignment="{Binding GridTableHeaderVerticalAlignment, ElementName=CustomDataGridTable}" VerticalContentAlignment="{Binding GridTableHeaderVerticalContentAlignment, ElementName=CustomDataGridTable}"/> <DataGrid Grid.Row="1" x:Name="Table" Background="{Binding GridTableBackground, ElementName=CustomDataGridTable}" AutoGenerateColumns="{Binding GridTableAutoGenerateColumns, ElementName=CustomDataGridTable}" GridLinesVisibility="{Binding GridTableLinesVisibility, ElementName=CustomDataGridTable}" ItemsSource="{Binding GridTableItemSource, ElementName=CustomDataGridTable}" SelectedItem="{Binding GridTableSelectedItem, ElementName=CustomDataGridTable}" SelectionMode="{Binding GridTableSelectionMode, ElementName=CustomDataGridTable}" IsReadOnly="{Binding GridTableReadOnly, ElementName=CustomDataGridTable}" BorderBrush="{Binding GridTableBorderBrush, ElementName=CustomDataGridTable}" BorderThickness="{Binding GridTableBorderThickness, ElementName=CustomDataGridTable}" CornerRadius="{Binding GridTableCornerRadius, ElementName=CustomDataGridTable}" CanUserSortColumns="{Binding GridTableUserSortColumns, ElementName=CustomDataGridTable}" CanUserReorderColumns="{Binding GridTableUserReorderColumns, ElementName=CustomDataGridTable}" CanUserResizeColumns="{Binding GridTableUserResizeColumns, ElementName=CustomDataGridTable}" ColumnWidth="{Binding GridTableColumnWidth, ElementName=CustomDataGridTable}" Margin="5,0,5,5" /> </Grid> </Border> </UserControl>
模型类
public class TargetClass { [DataGridAttribute("ID", DataGridColumnType.TextBox, Ignore = true)] public int? ID { get; set; } [DataGridAttribute("Service", DataGridColumnType.TextBox)] public string? Service { get; set; } [DataGridAttribute("Service Main Path", DataGridColumnType.TextBox)] public string? MainPath { get; set; } [DataGridAttribute("Service Msg. Target Dates", DataGridColumnType.TextBox)] public string? LogDate { get; set; } [DataGridAttribute("Service Msg. Includes", DataGridColumnType.TextBox)] public string? IncludeStatements { get; set; } [DataGridAttribute("Service Msg. Excludes", DataGridColumnType.TextBox)] public string? ExcludeStatements { get; set; } [DataGridAttribute("Service Msg. Includes Additional", DataGridColumnType.TextBox)] public List<string>? InsertKeywordString { get; set; } [DataGridAttribute("Service Log Config Entry", DataGridColumnType.TextBox)] public string? CreatedDate { get; set; } }
自定义特性
[AttributeUsage(AttributeTargets.Property)] public class DataGridAttribute : Attribute { public string ColumnName; public DataGridColumnType TargetType; public bool Ignore; public bool Marker; public DataGridAttribute(string columnname, DataGridColumnType targettype, bool marker = false, bool ignore = false) { ColumnName = columnname; TargetType = targettype; Marker = marker; Ignore = ignore; } } public enum DataGridColumnType { TextBox, TextBlock, ComboBox, Image }
表格效果

我尝试过开启AutoGenerateColumns,同样会出现空白区域,且比图中的更大。该如何解决这个问题?
更新1
在AXAML中设置ColumnWidth为"*"后,效果如下:
内容的提问来源于stack exchange,提问作者WDpad159
相关产品推荐
相关产品推荐

