Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dialog has unrequested additional space

Tags:

c#

winforms

wpf

I've designed a Windows Forms dialog that should be reusable in other applications, WPF and Windows Forms. This works fine when I use it in a Windows Forms application, but it causes some layout trouble when called in a WPF application. Dimensions and sizes are inconsistent when measured from the pixels on the screen, from what WinForms API says it is, and from Spy++. The window is 10 pixels wider and taller when run without a debugger than Spy++ says it is, and than I say it should be. What's the problem here? I can't find anything but say it's a badly broken .NET Framework.

Here's the Form class code:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace DialogTestApp
{
    internal class MyDialog : Form
    {
        public MyDialog()
        {
            Text = "Title";
            Width = 500;   // -> actually 510 (Spy++ says 500)
            Height = 300;   // -> actually 310 (Spy++ says 300)
            Font = SystemFonts.MessageBoxFont;
            FormBorderStyle = FormBorderStyle.FixedDialog;
            MaximizeBox = false;
            MinimizeBox = false;
            ShowInTaskbar = false;
            StartPosition = FormStartPosition.CenterScreen;

            TableLayoutPanel mainLayout = new TableLayoutPanel();
            mainLayout.BackColor = Color.FromArgb(255, 171, 255);   // pink
            mainLayout.Dock = DockStyle.Fill;
            mainLayout.Margin = Padding.Empty;
            mainLayout.Padding = Padding.Empty;
            mainLayout.RowStyles.Add(new RowStyle(SizeType.AutoSize));   // Only use minimum required space
            mainLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 100));
            Controls.Add(mainLayout);

            int row = 0;
            Label label = new Label();
            label.Text = "Hello world. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque suscipit vestibulum gravida.";
            label.Font = new Font(Font.FontFamily, 12);
            label.MaximumSize = new Size(mainLayout.Width, 0);
            label.AutoSize = true;
            label.Dock = DockStyle.Fill;
            label.Margin = Padding.Empty;
            label.BackColor = Color.FromArgb(58, 171, 58);   // green
            label.ForeColor = Color.White;
            mainLayout.Controls.Add(label, 0, row++);

            TextBox textBox = new TextBox();
            textBox.Dock = DockStyle.Fill;
            textBox.Margin = Padding.Empty;
            textBox.Multiline = true;
            textBox.ScrollBars = ScrollBars.Both;
            mainLayout.Controls.Add(textBox, 0, row++);
        }
    }
}

Just put this file in an empty WPF application project and call it from the application constructor:

public MainWindow()
{
    InitializeComponent();

    new MyDialog().ShowDialog();
    Application.Current.Shutdown();
}

Here's what it looks with a debugger:

enter image description here

And without:

enter image description here

The additional pink border is the 10 pixels that are not supposed to be there. The green label is set to fill up all space.

like image 566
ygoe Avatar asked Dec 01 '15 07:12

ygoe


1 Answers

Even without the TableLayoutPanel, Label, and using System.Windows.Forms.Application.Run(new MyDialog()), the problem still happens. The line that is causing the issue is FormBorderStyle = FormBorderStyle.FixedDialog;

Seems to be the same issue as described here: Form tells wrong size on Windows 8 — how to get real size?

Workaround:

        mainLayout.SizeChanged += delegate {
            label.MaximumSize = new Size(mainLayout.Width, 0);
            //MessageBox.Show("hi"); // called when not ran in debugger
        };
like image 93
Loathing Avatar answered Oct 14 '22 22:10

Loathing