Начало работы с Mono, C# и Glade#: как сделать так, чтобы появилось окно?

Я пытался начать работу с Mono и GTK# (у меня есть опыт программирования GUI на Qt/C++) и решил начать с очень простого тестового графического интерфейса.

Я установил установщик MS Windows Mono/GTK#, а затем, обнаружив, что ссылка меню «Пуск» на Glade не работает (поскольку она не была включена в пакет), я использовал Windows «Glade с GTK+». бинарный установщик с сайта Glade.

Затем я создал очень простой графический интерфейс в Glade (внизу этого поста) и написал свой первый фрагмент кода C# для его отображения. Однако, похоже, он не работает должным образом.

Программа «Привет, мир!» выводится на консоль правильно, а затем программа зависает без появления окна или вывода каких-либо сообщений об ошибках. Кажется, что окно было создано и цикл событий запущен, но оно не отображается. Я пытался удалить первый null из строки new Glade.XML и не включать файл Glade в качестве ресурса, но это не имело значения.

Я также попытался заменить xml-файл Glade GUI на тот, что находится в GtkSharpBeginnersGuide на mono веб-сайт (и изменение wndTestWindow на window1 в коде C#), и, похоже, он отлично работает, что означает, что есть проблема с моим XML Glade. Однако мне трудно понять, что не так с XML, созданным моей установкой Glade. Кто-нибудь может предложить какие-либо предложения?

Графический интерфейс поляны:

<?xml version="1.0"?>
<glade-interface>
  <!-- interface-requires gtk+ 2.12 -->
  <!-- interface-naming-policy project-wide -->
  <widget class="GtkWindow" id="wndTestWindow">
    <property name="title" translatable="yes">Test Window</property>
    <property name="window_position">center</property>
    <child>
      <widget class="GtkVBox" id="vboxTopLevel">
        <property name="visible">True</property>
        <property name="orientation">vertical</property>
        <child>
          <widget class="GtkHBox" id="hboxComboList">
            <property name="visible">True</property>
            <child>
              <widget class="GtkLabel" id="lblList">
                <property name="visible">True</property>
                <property name="label" translatable="yes">Here's a list:</property>
              </widget>
              <packing>
                <property name="position">0</property>
              </packing>
            </child>
            <child>
              <widget class="GtkComboBox" id="cmbList">
                <property name="visible">True</property>
              </widget>
              <packing>
                <property name="position">1</property>
              </packing>
            </child>
            <child>
              <widget class="GtkButton" id="btnList">
                <property name="label" translatable="yes">Do something</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">True</property>
              </widget>
              <packing>
                <property name="position">2</property>
              </packing>
            </child>
          </widget>
          <packing>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <widget class="GtkHButtonBox" id="hbtnboxButtonRow">
            <property name="visible">True</property>
            <child>
              <widget class="GtkButton" id="btnOK">
                <property name="label">gtk-ok</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">True</property>
                <property name="use_stock">True</property>
              </widget>
              <packing>
                <property name="expand">False</property>
                <property name="fill">False</property>
                <property name="position">0</property>
              </packing>
            </child>
            <child>
              <widget class="GtkButton" id="btnCancel">
                <property name="label">gtk-cancel</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">True</property>
                <property name="use_stock">True</property>
              </widget>
              <packing>
                <property name="expand">False</property>
                <property name="fill">False</property>
                <property name="position">1</property>
              </packing>
            </child>
          </widget>
          <packing>
            <property name="position">1</property>
          </packing>
        </child>
      </widget>
    </child>
  </widget>
</glade-interface>

Код теста С#:

using Glade;
using Gtk;
using System;

class TestApplication
{
    static void Main(string[] args)
    {
        System.Console.Write("Hello, World!\n");
        new TestApplication(args);
    }

    public TestApplication(string[] args)
    {
        Gtk.Application.Init();

        Glade.XML gxml = new Glade.XML(null, "test_mono.glade", "wndTestWindow", null);
        gxml.Autoconnect(this);
        Gtk.Application.Run();
    }
}

Скомпилировано и запущено с:

mcs -pkg:glade-sharp-2.0 -resource:test_mono.glade test_mono.cs
mono .\test_mono.exe

Версии:

Windows: XP Service Pack 3 Glade: 3.6.7 MCS Version 2.6.7.0 Mono & GTK#, установленный с помощью mono-2.6.7-gtksharp-2.12.10-win32-2.exe с веб-сайта Mono.

Скомпилировано и протестировано как с помощью cygwin, так и с помощью «Командной строки Mono-2.6.7».


person NPB    schedule 31.08.2010    source источник


Ответы (2)


Попробуйте добавить <property name="visible">True</property> к корневому виджету, чтобы он гласил:

<?xml version="1.0"?>
<glade-interface>
  <!-- interface-requires gtk+ 2.12 -->
  <!-- interface-naming-policy project-wide -->
  <widget class="GtkWindow" id="wndTestWindow">
    <property name="visible">True</property>
    <property name="title" translatable="yes">Test Window</property>
    <property name="window_position">center</property>
    <child>

В Glade это свойство можно найти на вкладке Общие свойства окна.

person stoft    schedule 12.09.2010
comment
Блестяще, вот оно: спасибо. У меня недостаточно репутации, чтобы голосовать, но я принял ответ. - person NPB; 13.09.2010

Возможно, вы захотите посмотреть на загрузку MonoDevelop для Windows. Gtk# уже давно не использует Glade. Обычно он использует Stetic, дизайнер которого встроен в MonoDevelop.

http://monodevelop.com/

person jpobst    schedule 31.08.2010
comment
Спасибо, но похоже, что Stetic очень сложно использовать, если вы не хотите использовать MonoDevelop для всего (чего я не делаю). Я попытался загрузить его, чтобы просто создать графический интерфейс с помощью Stetic, но не смог найти способ сделать это без создания всего проекта. Я вполне доволен IDE, которую использую: мне не нравится использовать разные IDE для разных языков. - person NPB; 13.09.2010