C# 调整datagrid最后一列的大小

C# 调整datagrid最后一列的大小,c#,wpf,datagrid,C#,Wpf,Datagrid,我有一个DataGrid,在两个不同的视图中使用。在每种情况下,如果用户调整主机控件/视图的大小,我希望最后一列调整其宽度 你会怎么做 干杯, 贝里尔 ... CanUserResizeColumns=“True” > <DataGrid.Columns> <DataGridTextColumn Header="Number" Binding="{Binding BusinessId}" IsReadOnly="True"

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

你会怎么做

干杯,
贝里尔

... 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>

    <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);
    }
}
public分部类列表:UserControl
{
专用双_currentColumnWidth;
公开上市()
{
初始化组件();
已加载+=已加载;
SizeChanged+=OnSizeChanged;
}
已加载专用void(对象发送方,RoutedEventArgs e)
{
_currentColumnWidth=colDescription.ActualWidth;
}
私有void OnSizeChanged(对象发送方,SizeChangedEventArgs e)
{
//如果控件尚未加载,则拆分
if(_currentColumnWidth==0)返回;
//只对宽度感兴趣,对高度不感兴趣
var widthChanged=e.widthChanged;
如果(!widthChanged)返回;
var delta=e.NewSize.Width-e.PreviousSize.Width;
var newWidth=_currentColumnWidth+delta;
if(newWidth=colDescription.MaxWidth)返回;
_currentColumnWidth=newWidth;
colDescription.Width=新的DataGridLength(_currentColumnWidth);
}
}

简单,只需替换XAML中的width属性即可

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

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

您不需要任何代码来处理宽度,因为WPF在XAML中满足了这一要求


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

我简化了我最初发布的“更新”中的代码,并修复了其中的一个bug。Jason建议使用“*”大小调整更简单,因此当网格本身不在UserControl内时应该使用,但我不知道当列位于UserControl内时,有什么更好的方法可以保持其大小正确

干杯,
贝里尔

下面的代码假定在调整控件大小时需要调整命名数据网格(即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);
    }
public分部类列表:UserControl
{
公开上市()
{
初始化组件();
SizeChanged+=OnSizeChanged;
}
私有void OnSizeChanged(对象发送方,SizeChangedEventArgs e)
{
//如果控件尚未加载,则拆分
如果(!dgProject.IsLoaded)返回;
//只对宽度感兴趣,对高度不感兴趣
如果(!e.WidthChanged)返回;
var delta=e.NewSize.Width-e.PreviousSize.Width;
var newWidth=colDescription.ActualWidth+delta;
if(newWidth=colDescription.MaxWidth)返回;
colDescription.Width=新的DataGridLength(newWidth);
}

@Jason Ebersey.*和Auto都具有自动调整大小的功能,区别在于Star“根据可用空间的加权比例自动调整元素大小”,而Auto“根据单元格内容和列标题自动调整元素大小”。虽然我怀疑如果网格只是窗口中的一个控件,您的解决方案会非常有效,但它不会同步UserControl中托管的列,而UserControl本身托管在其他视图容器中(请尝试这种方式,然后查看!).我的问题中可能没有明确说明这就是我想要解决的问题,所以我将把它作为答案!干杯