Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winforms PreferredSize属性没有';与GetPreferredSize不匹配_Winforms - Fatal编程技术网

Winforms PreferredSize属性没有';与GetPreferredSize不匹配

Winforms PreferredSize属性没有';与GetPreferredSize不匹配,winforms,Winforms,我正在尝试编写一个菜单项控件,它将根据包含的文本长度自动调整大小(如Label控件) 为此,我重写了GetPreferredSize方法来计算文本的长度: public override Size GetPreferredSize(Size proposedSize) { Size size = TextRenderer.MeasureText(this.Text, this.Font); int w = size.Width + this.Pad

我正在尝试编写一个菜单项控件,它将根据包含的文本长度自动调整大小(如Label控件)

为此,我重写了GetPreferredSize方法来计算文本的长度:

    public override Size GetPreferredSize(Size proposedSize)
    {
        Size size = TextRenderer.MeasureText(this.Text, this.Font);
        int w = size.Width + this.Padding.Left + this.Padding.Right;
        int h = size.Height + this.Padding.Top + this.Padding.Bottom;
        return new Size(w, h);
    }
然后,我将这些控件添加到包含菜单控件中,并尝试根据上面的大小定位它们:

            if (item.AutoSize)
            {
                item.Size = item.PreferredSize;
            }

            item.Left = _Left;
            item.Top = _Top;

            if (this.MenuOrientation == Orientation.Vertical)
            {
                _Top += item.Size.Height;
            }
            else
            {
                _Left += item.Size.Width;
            }

            this.Controls.Add(item);
但是,PreferredSize和GetPreferredSize返回的大小不同。对于一个字符串,GetPreferredSize返回{Width=147,Height=27},但PreferredSize返回{Width=105,Height=21}。因此,控件重叠,而不是并排出现

我尝试覆盖MinimumSize而不是GetPreferredSize,但这也从我的计算结果中缩小了


所以我的问题是,正确的方法是什么?我还想了解AutoSize、PreferredSize、MinimumSize和MaximumSize的交互方式。MSDN对此帮助不大。

我没有让容器控件继承面板,而是将其改为继承FlowLayoutPanel。在那之后,不管PreferredSize/GetPreferredSize发生了什么神奇的变化,这都是有效的。你应该把它写在答案中并接受它,这样这个问题就会被标记为已解决。