为什么我的所有标签都在此Windows窗体上空白?

时间:2013-03-19 21:34:52

标签: winforms label

我正在尝试在某些事件发生时显示和隐藏弹出窗口。弹出窗口正常显示和消失,但所有标签都是空白的。我最初试图在显示表单之前填充标签,但我已经评论了所有这些逻辑。标签全部为空白,但为每个标签正确分配了空间(参见屏幕截图)。

我的弹出控件:

public MyPopUp()
{
    InitializeComponent();
}

我的单独课程:

MyPopUp _MyPopUp;

protected override void OnLoad(IServiceProvider myServiceProvider)
{
    _MyPopUp = new MyPopUp();
}

protected override void WhenSomethingHappens() {
    _MyPopUp.Show();
}

protected override void WhenSomethingElseHappens() {
    _MyPopUp.Hide();
}

这是我的designer.cs文件的一部分。我只复制/粘贴了其中一个标签的代码,但表单上的其他5个标签的代码几乎相同。

private System.Windows.Forms.Label label1;

private void InitializeComponent()
{
    this.label1 = new System.Windows.Forms.Label();
    this.SuspendLayout();
    // 
    // label1
    // 
    this.label1.AutoSize = true;
    this.label1.Location = new System.Drawing.Point(58, 9);
    this.label1.Name = "label1";
    this.label1.Size = new System.Drawing.Size(41, 13);
    this.label1.TabIndex = 0;
    this.label1.Text = "Some Label Text"; 
    // 
    // MyPopUp
    // 
    this.Controls.Add(this.label1);
    this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
    this.Name = "MyPopUp";
    this.Text = "Some Text";
    this.ResumeLayout(false);
    this.PerformLayout();
}

screenshot

4 个答案:

答案 0 :(得分:3)

您需要调用Refresh()函数来强制每个子控件使其客户区无效,即重绘。

对于你的情况:

protected override void WhenSomethingHappens() {
    _MyPopUp.Show();
    _MyPopUp.Refresh();
}

答案 1 :(得分:0)

我做了一个测试,发现有可能使标签文字消失。如果ForeColorBackColor相同,则标签文字会消失。从您的标签添加代码,我看到您没有指定这些颜色。如果未定义WinForms控件,则从父控件(在本例中为Form本身)继承许多属性。这可能意味着Form的ForeColorBackColor是相同的,并且会传播到标签。更改表单或标签的ForeColor颜色以解决此问题。

答案 2 :(得分:0)

尝试在显示表单之前调用,这样表单将在主线程中创建。

if (this.InvokeRequired)
            this.BeginInvoke((Action)(() => //'this.' is the form
            {
                _MyPopUp.Show();
            }));

答案 3 :(得分:0)

这种情况正在发生,因为您无模式地运行表单。

如果您愿意,可以通过运行它来检查您的字体/背景颜色是否良好等。模式化:

System.Windows.Forms.Application.Run(YourFormName);

然后将DoEvent行添加到无模式调用中:

Form2 F2 = new Form2();
F2.Show();
System.Windows.Forms.Application.DoEvents();

那应该这样做!