Dialog有未经请求的额外空间

时间:2015-12-01 07:37:07

标签: c# wpf winforms

我设计了一个Windows窗体对话框,该对话框应该可以在其他应用程序,WPF和Windows窗体中重复使用。当我在Windows窗体应用程序中使用它时,这可以正常工作,但在WPF应用程序中调用时会导致一些布局问题。从屏幕上的像素,WinForms API所说的以及Spy ++中测量的尺寸和大小是不一致的。窗口宽10像素,在没有调试器的情况下运行比Spy ++说的要高,而且比我说它应该是。这里的问题是什么?我找不到任何东西,只是说它是一个严重破坏的.NET Framework。

这是Form类代码:

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++);
        }
    }
}

只需将此文件放在空的WPF应用程序项目中,然后从应用程序构造函数中调用它:

public MainWindow()
{
    InitializeComponent();

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

以下是调试器的外观:

enter image description here

没有:

enter image description here

额外的粉红色边框是不应该在那里的10个像素。绿色标签设置为填满所有空间。

1 个答案:

答案 0 :(得分:2)

即使没有TableLayoutPanelLabel和使用System.Windows.Forms.Application.Run(new MyDialog()),问题仍然存在。导致此问题的行是FormBorderStyle = FormBorderStyle.FixedDialog;

似乎与此处描述的问题相同:Form tells wrong size on Windows 8 — how to get real size?

解决方法:

        mainLayout.SizeChanged += delegate {
            label.MaximumSize = new Size(mainLayout.Width, 0);
            //MessageBox.Show("hi"); // called when not ran in debugger
        };