我尝试全局应用DataGrid的样式,如下所示:
<Style TargetType="DataGrid">
<Setter Property="ColumnWidth" Value="*"/>
<Setter Property="RowHeaderWidth" Value="0"/>
</Style>
RowHeaderWidth
的样式有效,但ColumnWidth
样式不起作用(DataGrid 末尾有空列)。当我在 DataGrid 中显式设置ColumnWidth="*"
时,它可以工作(空列已消失)。
我想知道我们是否能够在样式中全局设置ColumnWidth="*"
?提前谢谢你!
DataGrid.ColumnWidth 不能将样式作为其他属性应用。我们必须显式分配值
在我正在从事的项目中,我们制作了很多自己的控件,这些控件位于ResourceDictionary
中。我们使用与您完全相同的方法。那么,您的Style
标签在ResourceDictionary
中吗?
ColumnWidth setter 适用于自动生成的列,但不适用于手动定义的列。对我来说,这似乎是 WPF 中的一个疏忽。您也无法设置列本身的宽度样式,如本答案所述。
它建议使用附加属性,并提供一个示例,我使用该示例作为解决方案的灵感。我定义这个附加属性:
public static class DataGridHelper
{
public static DataGridLength GetColumnWidth(DataGrid obj) => (DataGridLength)obj.GetValue(ColumnWidthProperty);
public static void SetColumnWidth(DataGrid obj, DataGridLength value) => obj.SetValue(ColumnWidthProperty, value);
/// <summary>
/// The ColumnWidth attached property sets the Width of all columns.
/// </summary>
public static readonly DependencyProperty ColumnWidthProperty =
DependencyProperty.RegisterAttached("ColumnWidth", typeof(DataGridLength), typeof(DataGridHelper), new PropertyMetadata(ColumnWidthChanged));
private static void ColumnWidthChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var dataGrid = d as DataGrid;
var columns = dataGrid.Columns;
var width = GetColumnWidth(dataGrid);
dataGrid.Columns.CollectionChanged += (s1, e1) => UpdateColumnWidths(columns, width);
UpdateColumnWidths(columns, width);
}
private static void UpdateColumnWidths(ICollection<DataGridColumn> columns, DataGridLength width)
{
foreach (var column in columns) column.Width = width;
}
}
然后使用样式将其添加到我的数据网格中:
<Style TargetType="DataGrid">
<Setter Property="local:DataGridHelper.ColumnWidth" Value="*"/>
</Style>