C# 调整datagrid最后一列的大小
我有一个DataGrid,在两个不同的视图中使用。在每种情况下,如果用户调整主机控件/视图的大小,我希望最后一列调整其宽度 你会怎么做 干杯,C# 调整datagrid最后一列的大小,c#,wpf,datagrid,C#,Wpf,Datagrid,我有一个DataGrid,在两个不同的视图中使用。在每种情况下,如果用户调整主机控件/视图的大小,我希望最后一列调整其宽度 你会怎么做 干杯, 贝里尔 ... CanUserResizeColumns=“True” > <DataGrid.Columns> <DataGridTextColumn Header="Number" Binding="{Binding BusinessId}" IsReadOnly="True"
贝里尔 ... 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本身托管在其他视图容器中(请尝试这种方式,然后查看!).我的问题中可能没有明确说明这就是我想要解决的问题,所以我将把它作为答案!干杯