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,

Другие вопросы по тегам