GTK# window 未完全呈现

GTK# window not rendered completely

现在,我正在尝试在 Debian (Raspbian) 系统上使用 Mono 和 GTK# 开发一个程序。

我面临的问题是,完全随机地,GUI(由 Stetic 设计器或其动态元素生成)没有完全绘制,缺少标签元素中的几个字符或整个小部件,主要是那些动态创建的。这是它在对话框中的样子 window:http://imgur.com/oEZRg7c(文本被截断)

一旦一个 window 显示此问题,其他每个 window 都有相同的问题,有时会丢失整个小部件,即使这些小部件是后来创建的。解决方法通常是退出程序并重新打开它,因为它只是随机发生的。

我的大部分 windows 的构造函数是这样的(Build() 之后的部分有所不同):

public partial class ErrorSolutionDialog : Gtk.Dialog
{
    public ErrorSolutionDialog (string errorMessage, string solutionHint)
    {
        this.WidthRequest = this.Screen.Width;
        this.HeightRequest = this.Screen.Height;
        this.Maximize ();
        this.Fullscreen ();
        this.KeepAbove = true;
        this.DestroyWithParent = false;
        Build ();

        this.ErrorMessage.Markup = "<b><span size='xx-large'>" + errorMessage + "</span></b>";
        this.SolutionHint.Text = solutionHint;
    }
}

我不会说在 Xamarin Studio/Monodevelop 中使用 Stetic 设计器不好,但作为任何一款软件,它肯定存在一些问题。

此外,在任何软件环境中使用任何设计器都会使您永远依赖于该开发平台。最后,创建的源代码将很难维护,除了对你来说完全陌生。

这就是为什么我总是建议摆脱设计师。您可以关注 Gtk# tutorial such as this one,您会发现这既简单又有益。您将完全彻底地控制您的代码。

Gtk# 的基础知识是使用 VBox 和 HBox 创建布局。例如,以下代码创建了一个布局,您将在其中的对话框中拥有一个 TreeView 和一个 TextView。

var swWin1 = new Gtk.ScrollWindow();
var swWin2 = new Gtk.ScrollWindow();

// TextView
this.txtView = new Gtk.TextView();
swWin1.AddWithViewport( this.txtView );

// TreeView
this.tvView = new Gtk.TreeView();
swWin2.AddWithViewport( this.tvView );

// Layout
var hBox = new HBox( false, 2 );
hBox.PackStart( swWin1, true, true, 5 );
hBox.PackStart( swWin2, true, true, 5 );
this.VBox.PackStart( hBox, true, true, 5 );

PackStart() 是一种神奇的方法,可以将小部件添加到布局中。布尔值告诉 Gtk 展开小部件。 ScrollWindow向任何小部件添加滚动条。

最后,我的建议是对于任何操作,使用 Gtk.Action,并调用其方法 CreateMenuItem()CreateToolItem() 以创建菜单项和工具栏按钮,而不是一次又一次地重复相同的代码。

希望对您有所帮助。