调整DataGrid的最后一列大小

3

我有一个DataGrid在两个不同的视图中使用。在每种情况下,如果用户调整主控件/视图的大小,我都希望最后一列调整其宽度。

你会怎么做呢?

祝好,
Berryl

... CanUserResizeColumns="True" >

    <DataGrid.Columns>
        <DataGridTextColumn 
            Header="Number" Binding="{Binding BusinessId}" IsReadOnly="True" 
            CanUserSort="True" CanUserResize="False"
            Width="75"/>
        <DataGridTextColumn 
            Header="Description" Binding="{Binding Description}" IsReadOnly="True" 
            CanUserSort="True" SortDirection="Ascending" CanUserResize="True"
            MinWidth="260" Width="Auto"  />
    </DataGrid.Columns>

</DataGrid>

更新(可用代码)

我刚刚在xaml中为该列命名,并将以下代码放入后台代码中。如果有更好的想法或优化方法,请告诉我!

public partial class Listing : UserControl
{
    private double _currentColumnWidth;

    public Listing()
    {
        InitializeComponent();

        Loaded += OnLoaded;
        SizeChanged += OnSizeChanged;
    }

    private void OnLoaded(object sender, RoutedEventArgs e)
    {
        _currentColumnWidth = colDescription.ActualWidth;
    }

    private void OnSizeChanged(object sender, SizeChangedEventArgs e)
    {
        // split if control is not loaded yet
        if (_currentColumnWidth == 0) return;

        // only interested in width, not height
        var widthChanged = e.WidthChanged;
        if (!widthChanged) return;

        var delta = e.NewSize.Width - e.PreviousSize.Width;
        var newWidth = _currentColumnWidth + delta;
        if (newWidth <= colDescription.MinWidth || newWidth >= colDescription.MaxWidth) return;

        _currentColumnWidth = newWidth;
        colDescription.Width = new DataGridLength(_currentColumnWidth);
    }
}
2个回答

2

很简单,只需在您的XAML中替换宽度属性即可。

<DataGridTextColumn 
                Header="Description" Binding="{Binding Description}" 
                IsReadOnly="True" 
                CanUserSort="True" SortDirection="Ascending" CanUserResize="True"
                MinWidth="260" Width="Auto"  />

to ...

<DataGridTextColumn 
                Header="Description" Binding="{Binding Description}" IsReadOnly="True" 
                CanUserSort="True" SortDirection="Ascending" CanUserResize="True"
                MinWidth="260" Width="*"  />

在WPF中,您不需要任何代码来处理宽度,因为这些都可以在XAML中完成。

"*"表示自动调整大小的值 :)


@Jason Ebersey。both * and Auto都具有自动调整大小的能力,不同之处在于Star“根据可用空间的加权比例自动调整元素的大小”,而Auto“根据单元格内容和列标题自动调整元素的大小”。虽然我怀疑如果网格只是窗口中的一个控件,您的解决方案将完美地工作,但它不会同步托管在UserControl内部的列,该UserControl本身托管在其他视图容器中(以这种方式尝试并查看!)。 - Berryl
我可能在我的问题中没有表达清楚,但这正是我想要解决的情况,所以我会将其标记为答案!干杯 - Berryl

1

我简化了原贴中的代码并纠正了其中存在的错误。Jason建议使用“*”大小调整更为简单,在一个UserControl内部时应该使用这种方法,但是我不知道在UserControl内部保持列正确大小的更好方法。

祝好!
Berryl

下面的代码假设有一个命名为DataGrid(即dgProject)和一个需要在控件调整大小时调整大小的命名列(即colDescription)。

public partial class Listing : UserControl
{

    public Listing()
    {
        InitializeComponent();

        SizeChanged += OnSizeChanged;
    }

    private void OnSizeChanged(object sender, SizeChangedEventArgs e)
    {
        // split if control is not loaded yet
        if (!dgProject.IsLoaded) return;

        // only interested in width, not height
        if (!e.WidthChanged) return;

        var delta = e.NewSize.Width - e.PreviousSize.Width;
        var newWidth = colDescription.ActualWidth + delta;
        if (newWidth <= colDescription.MinWidth || newWidth >= colDescription.MaxWidth) return;

        colDescription.Width = new DataGridLength(newWidth);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接