【发布时间】:2010-04-20 12:32:18
【问题描述】:
我正在用 C#(Windows 窗体)开发一个应用程序,它使用 Mono 在 Mac OS X 上运行。 它包含一些动态控件,例如一个包含一些标签和文本框的自定义组框、一个按钮等。这些框都可以动态添加和删除。
我的CustomGrpBx 继承自GroupBox,这是我使用的构造函数:
public CustomGrpBx(Point CreateHere,Info Inf)
{
this.Name = Inf.Name;
this.Location = CreateHere;
CreateHere.Y = 10;
CreateHere.X = 10;
CreateHere.Y += 7;
Button btnPress = new Button();
btnPress.Location = CreateHere;
btnPress.Size = new Size(40, 24);
btnPress.Text = Name;
btnPress.Enabled = false;
this.Controls.Add(btnPress);
CreateHere.X += 45;
CreateHere.Y += 2;
TextBox txtName = new TextBox();
txtName.Location = CreateHere;
txtName.Size = new Size(75, 20);
txtName.Text = Name;
txtName.ReadOnly = true;
this.Controls.Add(txtName);
CreateHere.X += 80;
//More code here, but the same pattern as above
this.Size = new Size(CreateHere.X + 30, CreateHere.Y + 35);
}
在创建和删除它们时,甚至在显示消息框时都会出现问题。 发生的情况是有时在渲染时出现白框,或者某些标签未正确绘制。有时当一个消息框出现时,它首先会像 5 个空白的假人一样打开,而且您无法关闭。
我是不是做错了什么,我应该在每次创建后让 GUI 线程休眠一点,还是应该自己使东西无效?还是我应该试试 GTK#?
非常感谢您对此的意见。
【问题讨论】:
-
非常标准的违反线程规则的标志。仅在主 UI 线程中更新/显示 UI 组件,使用 Control.Begin/Invoke() 来编组调用。
-
我正在使用一个后台工作者,但它只适用于另一个类中的静态,而不是直接使用 gui 对象。
标签: winforms user-interface mono render