gtk#窗口没有完全渲染

本文关键字:窗口 gtk# | 更新日期: 2023-09-27 18:06:54

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

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

一旦一个窗口出现这个问题,所有其他窗口都有同样的问题,有时会丢失整个小部件,即使这些小部件是在之后创建的。解决方案通常是退出程序并重新打开它,因为它只是随机发生的。

这是我的大多数窗口的构造函数看起来像(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;
    }
}

gtk#窗口没有完全渲染

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

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

这就是为什么我总是建议摆脱设计师。您可以学习gtk#教程,例如本教程,您会发现它既简单又有益。你可以完全控制你的代码。

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。操作,并调用其方法CreateMenuItem()CreateToolItem(),以便创建菜单项和工具栏按钮,而不是一次又一次地重复相同的代码。