WPF - Ширина DataGridColumn не возвращает ожидаемое значение
.NET4.0: я строю DataGrid в коде, поэтому я не использую XAML. Только на C# Когда пользователь щелкает правой кнопкой мыши в любом месте заголовка столбца, я хочу показать контекстное меню. Вот некоторый код, чтобы дать вам идею:
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);
}
}
Проблема с этим подходом состоит в том, что пользователь должен щелкнуть на фактическом TextBox, чтобы активировать контекстное меню, а не в любом месте заголовка.
Поскольку я не могу придумать, как заставить TextBox заполнить ширину заголовка, все, что я могу сделать, это изменить свойство ширины TextBox, чтобы привязать его к ширине столбца. Столбцы растягиваются, чтобы соответствовать их содержанию, и поэтому имеют разную ширину. Однако, когда я печатаю все свойства столбца ActualWidth в консоль, он говорит, что все они имеют ширину 20, а это не то, на что похож мой графический интерфейс. Как я могу получить ширину столбца, которая соответствует тому, как он выглядит в моем графическом интерфейсе?
1 ответ
Чтобы решить вашу проблему, вы должны поменять свой метод тела следующим телом:
Этот код был протестирован:
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
свойство, таким образом, занимая все пространство (высота и ширина) Header
,