在Mac OS X上使用C#Mono的随机GUI错误

问题描述:

我正在C#(Windows窗体)中开发应用程序,该应用程序使用Mono在Mac OS X上运行。 它包含一些动态控件,例如包含一个自定义groupbox一些标签和文本框,一个按钮等。这些框都可以动态添加和删除。在Mac OS X上使用C#Mono的随机GUI错误

CustomGrpBxGroupBox继承,这是我用的构造器:

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#?

非常感谢在此输入。

+0

非常标准的违反规则穿线的迹象。只在主UI线程中更新/显示UI组件,请使用Control.Begin/Invoke()来封送调用。 – 2010-04-20 13:20:39

+0

我正在使用背景工作器,但那个只能在另一个类的静态工作,而不是直接使用gui对象。 – 2010-04-20 13:24:19

很难在没有看到实际代码的情况下提供建议,但首先,如果您主要开发了针对.NET平台的项目,请首先检查您的程序集是否存在不兼容问题(例如,pinvoke的问题)。然后,mono团队宣称Windows单窗口支持已完成:

对Windows Forms 2.0的支持已完成。在这一点上,我们主要是修复bug和抛光我们的代码。

因此,您可以尝试在.NET下运行您的项目,并查看错误是否仍然存在。

至于Gtk#。我认为如果项目的主OS是OSX,最好使用gtk#。至少你可以使用一些OSX特定的东西,例如,集成在它的工具栏中。查看here,了解Gtk#项目的开源示例,该项目使用一些本机OSX功能并在其环境中良好集成。 MonoDevelop的设计者也支持gtk#。

P.S. 一些有趣的Gtk#项目玩: BeagleTomboy

+0

添加代码示例 而且我在windows中使用相同的代码获得零问题,而且MoMa不会给我带来任何错误:/ – 2010-04-20 13:21:43

+0

嗯,说实话,我没有看到任何与您的错误相关的内容。 – n535 2010-04-20 13:40:02

+0

我会尽力在下次在Mac上获取它的打印屏幕。 是否应该将prob报告给mono团队? – 2010-04-20 13:41:32