【问题标题】:Random GUI errors using C# Mono on Mac OS X在 Mac OS X 上使用 C# Mono 的随机 GUI 错误
【发布时间】: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


【解决方案1】:

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

对 Windows Forms 2.0 的支持已完成。在这一点上,我们主要只是修复错误和完善我们的代码。

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

至于 Gtk#。如果您的项目的主要操作系统是 OSX,我认为最好使用 gtk#。至少您将能够使用一些特定于 OSX 的东西,例如,集成到它的工具栏中。查看here 的 Gtk# 项目的开源示例,该项目使用一些本机 OSX 功能并在其环境中很好地集成。 MonoDevelop 的设计器也支持 gtk#。

附: 一些有趣的 Gtk# 项目可以玩: Beagle, Tomboy

【讨论】:

  • 添加了代码示例并且我在 Windows 中使用相同的代码得到零问题,而 MoMa 没有给我任何错误:/
  • 好吧,老实说,我没有看到任何与您的错误相关的内容。
  • 下次我在 Mac 上时,我会尝试获取它的打印屏幕。 prob bug 是否应该向 mono 团队报告?
  • 我不知道,首先,尝试在Linux机器上运行你的应用程序,例如,它不会在mono中出现错误,代码太简单了,真的。本质上,您只是在表单中动态添加控件,这是一种常见情况。我认为错误在不同的地方。但一切皆有可能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-18
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多