You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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 
}

表格效果

DataGrid空白列

我尝试过开启AutoGenerateColumns,同样会出现空白区域,且比图中的更大。该如何解决这个问题?

更新1

在AXAML中设置ColumnWidth为"*"后,效果如下:
表格效果

内容的提问来源于stack exchange,提问作者WDpad159

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 00:44:55