当我使用属性窗口中的pixbuf选项将图像添加到gtk窗口时,Monodevelop不断崩溃

时间:2019-05-22 14:59:31

标签: c# crash gtk monodevelop gtk#

我正在为学校的家庭作业项目制作一个简单的应用程序,并且尝试添加图像,但是每次执行IDE崩溃时,如果我设法进行编译,当我继续进入该窗口时,程序崩溃。它没有给我一个错误,当我在终端中打开它时,什么也没输出。

我尝试使用随附的图标,尝试将其导入到项目目录中,并且尝试访问它作为指向文件的链接,但无济于事。

这是构建中处理图像文件的部分,但是我真的不知道我在做什么,因为这是我制作的第一个gtk应用程序。我可以根据需要提供其他代码段。当图像加载到程序中时,我无法提供任何代码示例,因为它会立即崩溃。

// Container child hbox6.Gtk.Box+BoxChild
            this.image1 = new global::Gtk.Image();
            this.image1.Name = "image1";
            this.hbox6.Add(this.image1);
            global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.hbox6[this.image1]));
            w6.Position = 0;
            w6.Expand = false;
            w6.Fill = false;
            // Container child hbox6.Gtk.Box+BoxChild
            this.image2 = new global::Gtk.Image();
            this.image2.Name = "image2";
            this.hbox6.Add(this.image2);
            global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(this.hbox6[this.image2]));
            w7.Position = 1;
            w7.Expand = false;
            w7.Fill = false;
            this.hbox3.Add(this.hbox6);
            global::Gtk.Box.BoxChild w8 = ((global::Gtk.Box.BoxChild)(this.hbox3[this.hbox6]));
            w8.Position = 0;
            w8.Expand = false;
            w8.Fill = false;
            // Container child hbox3.Gtk.Box+BoxChild
            this.hbox4 = new global::Gtk.HBox();
            this.hbox4.Name = "hbox4";
            this.hbox4.Spacing = 6;
            // Container child hbox4.Gtk.Box+BoxChild
            this.image3 = new global::Gtk.Image();
            this.image3.Name = "image3";
            this.hbox4.Add(this.image3);
            global::Gtk.Box.BoxChild w9 = ((global::Gtk.Box.BoxChild)(this.hbox4[this.image3]));
            w9.Position = 0;
            w9.Expand = false;
            w9.Fill = false;
            // Container child hbox4.Gtk.Box+BoxChild
            this.image4 = new global::Gtk.Image();
            this.image4.Name = "image4";
            this.hbox4.Add(this.image4);
            global::Gtk.Box.BoxChild w10 = ((global::Gtk.Box.BoxChild)(this.hbox4[this.image4]));
            w10.Position = 1;
            w10.Expand = false;
            w10.Fill = false;

没有错误消息,因为整个过程要么完全崩溃要么停止响应,所以我无法提供类似的信息。任何帮助,将不胜感激。谢谢您的宝贵时间。

1 个答案:

答案 0 :(得分:0)

首先,您不需要使用设计器来完成如此简单的任务。此外,设计人员始终将您与给定的IDE(在这种情况下为MonoDevelop)联系在一起。图形工具包比以前直观得多,而且很多时候了解如何使用它们也很简单。

这是一个仅在窗口中显示图像的项目的完整代码。

class MainWindow: Gtk.Window {
    public MainWindow()
        :base(Gtk.WindowType.Toplevel)
    {
        this.Build();


        this.DeleteEvent += (o, args) => Gtk.Application.Quit();
    }

    void Build()
    {
        var imgContainer = this.BuildEmbeddedImage();

        this.Add( imgContainer );
    }

    Gtk.Image BuildExternalImage()
    {
        return new Gtk.Image( "res/prowl.jpg" );
    }

    Gtk.Image BuildEmbeddedImage()
    {
        var pixbufImage = new Gdk.Pixbuf(
            System.Reflection.Assembly.GetEntryAssembly(),
            "CSShowImage.res.prowl.jpg");

        return new Gtk.Image( pixbufImage );
    }
}

class Ppal
{
    [System.STAThread]
    static void Main()
    {
        Gtk.Application.Init();
        new MainWindow().ShowAll();
        Gtk.Application.Run();
    }
}

要使该代码正常工作,您必须执行以下操作:

  1. 下载图像。我下载了有关自动机器人PROWL的图像,并将其命名为prowl.jpg,但是您当然可以选择任何想要的东西。

  2. 通过MonoDevelop在项目中创建目录(右键单击该项目,然后选择“新文件夹”)。

  3. 将图像复制到该文件夹​​:右键单击新创建的文件夹(我称该文件夹为“ res”),然后选择“添加文件”,在MonoDevelop询问要执行的操作时将图像复制到该文件夹​​。

  4. 右键单击图像,然后选择“快速属性>>复制到输出目录”。这将使BuildExternalImage()方法起作用。如果您不打算使用外部图像,则可以跳过此步骤。考虑到这种方式,您必须使用可执行文件分发映像(在名为“ res”的目录中)。

  5. 右键单击该图像,然后选择“构建操作>> EmbbeddedResource”。这将使方法BuildEmbeddedImage()起作用。该映像将位于您的可执行文件内,无需担心其他任何事情。唯一需要注意的是,在BuildEmbeddedImage中,您不必创建带有项目名称,带有图像的目录名称以及名称的字符串,而不必读取“ CSShowImage.res.prowl.jpg”这一行。图片的名称。例如,如果您的项目名为“ HomeWork”,您将文件夹创建为“ res”,并且图像是“ myfamily.jpg”,那么结果字符串将是“ HomeWork.res.myfamily.jpg”

如果您坚持使用设计器,那么:

  1. 在Gtk#2.0部分的MonoDevelop中创建一个新项目

  2. 转到MainWindow.cs并进入设计器。

  3. 从正在设计的窗口内的工具箱中拖放一个Image小部件。 MonoDevelop会抱怨您使用小部件而不是容器(例如VBox),然后在其中使用小部件。继续选择哪个选项。

  4. 选择图像小部件,然后转到属性,展开“图像属性”。在pixbuf中,单击“ ...”按钮。转到资源文件夹。点击“添加”,然后选择您的图片。 MonoDevelop将为您完成繁重的工作,并且图像将立即出现在设计器中。

  5. 单击“运行”。

老实说,MonoDevelop在第一次执行时崩溃,但是在再次打开项目时看起来很稳定。

希望这会有所帮助。