簡単な解決策は、次のように ColumnWidth プロパティを設定するだけで、DataGrid の列にスターサイズを使用させることです。
<DataGrid Width="800" ColumnWidth="*" />
ただし、問題は、これによりすべての列の幅が等しくなることであり、これはおそらく望ましくありません。
だから私がすることは、最初にすべての列を現在のようにデフォルトの方法で作成し、その後各列をスターサイズに設定することです。そうすれば、新しい幅の値を計算して、列の初期サイズを維持できます。
私が何を意味するかを示すために、小さなコードを書きました..
XAML
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication2"
Title="MainWindow" Height="350" Width="850">
<StackPanel>
<DataGrid x:Name="dgTest" Width="800" Loaded="dgTest_Loaded" />
</StackPanel>
</Window>
分離コード
public partial class MainWindow : Window
{
public class Test
{
public string P1 { get; set; }
public string P2 { get; set; }
public string P3 { get; set; }
}
public MainWindow()
{
InitializeComponent();
var t = new List<Test>(new[] {
new Test{ P1="på,dsl", P2="234234", P3="asdasdasd"},
new Test{ P1="asasaspå,dsl", P2="23sadasd asf afasdasdasd4234", P3="asdasdasd" },
new Test{ P1="på,ds1231l", P2="234", P3="1ddsdasd" },
});
dgTest.ItemsSource = t;
}
private void dgTest_Loaded(object sender, RoutedEventArgs e)
{
//Make the columns use starsizing so their combined width
//can't be bigger than the actual datagrid that contains them.
foreach (var column in dgTest.Columns)
{
var starSize = column.ActualWidth / dgTest.ActualWidth;
column.Width = new DataGridLength(starSize, DataGridLengthUnitType.Star);
}
}
}