WPF - DataGridColumn宽度未返回预期值

时间:2015-07-02 13:35:19

标签: c# wpf wpfdatagrid datagridcolumn datagridcolumnheader

.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 width属性以绑定到列的宽度。列伸展以适合其内容,因此它们具有不同的宽度。但是,当我将所有列ActualWidth属性打印到控制台时,它表示它们都具有宽度20,这不是我的GUI的样子。如何获得与GUI中的外观相对应的列宽?

1 个答案:

答案 0 :(得分:0)

为了解决你的问题必须通过这个身体交换你的身体方法:

此代码已经过测试:

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的所有空间(高度和宽度)。