WPF - DataGridColumn 宽度未返回预期值
WPF - DataGridColumn Width not Returning Expected Value
.NET4.0:我正在代码隐藏中构建 DataGrid,因此我没有使用任何 XAML。仅限 C#。当用户右键单击 header 列中的任意位置时,我想显示一个上下文菜单。这里有一些代码可以给你一个想法:
public void MakeAllColumns()
{
for (int i = 0; i < AllColumnDisplayNames.Length; i++)
{
// create a new column depending on the data to be displayed
DataGridTextColumn col = new DataGridTextColumn();
col.MaxWidth = 300;
// create a new Textblock for column's header and add it to the column
TextBlock headerText = new TextBlock() { Text = AllColumnDisplayNames[i] };
col.Header = headerText;
/// create a new context menu and add it to the header
ContextMenu menu = new ContextMenu();
headerText.ContextMenu = menu;
// build the context menu depending on the property
menu.Items.Add(new Button() { Content = "FOOBAR" });
// add the bindings to the data
col.Binding = new Binding(AllColumnBindings[i]);
AllColumns.Add(AllColumnDisplayNames[i], col);
}
}
此方法的问题是用户需要单击实际的文本框才能激活上下文菜单,而不是 header 上的任何位置。
因为我想不出让 TextBox 填充 header 宽度的方法,所以我能想到的就是更改 TextBox 宽度 属性 以绑定到列的宽度。列会拉伸以适合其内容,因此它们具有不同的宽度。但是,当我将所有列 ActualWidth 属性打印到控制台时,它说它们的宽度都是 20,这不是我的 GUI 的样子。如何获得与其在我的 GUI 中的外观相对应的列宽?
为了解决你的问题必须通过这个body:
交换你的body方法
此代码已测试:
for (int i = 0; i < AllColumnDisplayNames.Length; i++)
{
// create a new column depending on the data to be displayed
DataGridTextColumn col = new DataGridTextColumn();
col.MaxWidth = 300;
/// create a new context menu
ContextMenu menu = new ContextMenu();
// build the context menu depending on the property
menu.Items.Add(new Button() { Content = "FOOBAR" });
// create a new column's header and add it to the column
DataGridColumnHeader head = new DataGridColumnHeader() { Content = AllColumnBindings[i] };
head.ContextMenu = menu;//add context menu to DataGridColumnHeader
col.Header = head;
// add the bindings to the data
col.Binding = new Binding(AllColumnBindings[i]);
AllColumns.Add(AllColumnDisplayNames[i], col);
}
我没有使用 TextBlock
,而是使用了 DataGridColumnHeader
,它具有 ContextMenu
属性,因此占据了所有 space(高度和宽度) Header
.
.NET4.0:我正在代码隐藏中构建 DataGrid,因此我没有使用任何 XAML。仅限 C#。当用户右键单击 header 列中的任意位置时,我想显示一个上下文菜单。这里有一些代码可以给你一个想法:
public void MakeAllColumns()
{
for (int i = 0; i < AllColumnDisplayNames.Length; i++)
{
// create a new column depending on the data to be displayed
DataGridTextColumn col = new DataGridTextColumn();
col.MaxWidth = 300;
// create a new Textblock for column's header and add it to the column
TextBlock headerText = new TextBlock() { Text = AllColumnDisplayNames[i] };
col.Header = headerText;
/// create a new context menu and add it to the header
ContextMenu menu = new ContextMenu();
headerText.ContextMenu = menu;
// build the context menu depending on the property
menu.Items.Add(new Button() { Content = "FOOBAR" });
// add the bindings to the data
col.Binding = new Binding(AllColumnBindings[i]);
AllColumns.Add(AllColumnDisplayNames[i], col);
}
}
此方法的问题是用户需要单击实际的文本框才能激活上下文菜单,而不是 header 上的任何位置。
因为我想不出让 TextBox 填充 header 宽度的方法,所以我能想到的就是更改 TextBox 宽度 属性 以绑定到列的宽度。列会拉伸以适合其内容,因此它们具有不同的宽度。但是,当我将所有列 ActualWidth 属性打印到控制台时,它说它们的宽度都是 20,这不是我的 GUI 的样子。如何获得与其在我的 GUI 中的外观相对应的列宽?
为了解决你的问题必须通过这个body:
交换你的body方法此代码已测试:
for (int i = 0; i < AllColumnDisplayNames.Length; i++)
{
// create a new column depending on the data to be displayed
DataGridTextColumn col = new DataGridTextColumn();
col.MaxWidth = 300;
/// create a new context menu
ContextMenu menu = new ContextMenu();
// build the context menu depending on the property
menu.Items.Add(new Button() { Content = "FOOBAR" });
// create a new column's header and add it to the column
DataGridColumnHeader head = new DataGridColumnHeader() { Content = AllColumnBindings[i] };
head.ContextMenu = menu;//add context menu to DataGridColumnHeader
col.Header = head;
// add the bindings to the data
col.Binding = new Binding(AllColumnBindings[i]);
AllColumns.Add(AllColumnDisplayNames[i], col);
}
我没有使用 TextBlock
,而是使用了 DataGridColumnHeader
,它具有 ContextMenu
属性,因此占据了所有 space(高度和宽度) Header
.