Buscar este blog

sábado, 1 de junio de 2013

Gtk Builder en .Net

Gtk Builder es la forma mas moderna de crear interfaces en gtk por medio de un editor WYSIWYG, es mas completo que stetic y el editor no truena en cada paso.
Es posible usar GTK.Builder en proyectos .Net o Mono pero la documentación es practicamente inexistente de hecho yo aprendi a usarlo en un sitio de Python pues como siempre la gente de mono tiene el proyecto completamente descuidado.
Lo básico es crear el objeto cargar el archivo xml que creamos con el programa Glade (que también funciona en Windows) obtener la ventana que queremos usar y mostrarla, es mejor crear una ventana por archivo pues despues nos puede dar problemas encontrar objetos con el mismo identificador.
Tambien debemos escribir un poco de código para poder usar los objetos que contiene el archivo ya que no hay forma de cargarlos automaticamente, solo buscamos el objeto dentro del Builder y lo asignamos a una variable de la clase.
Para las señales (eventos) lo mejor es usar las referencias que encontramos en el paso anterior y asignar los eventos directamente ya que aunque hay una función para conectar los eventos es complicada y de todos modos ya tenemos las referencias así que es más facil hacerlo de esta manera.
A continuación el codigo de ejemplo:

<?xml version="1.0"?>
<interface>
  <requires lib="gtk+" version="2.16"/>
  <!-- interface-naming-policy toplevel-contextual -->
  <object class="GtkWindow" id="window1">
    <child>
      <object class="GtkVBox" id="vbox1">
        <property name="visible">True</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkLabel" id="label1">
            <property name="visible">True</property>
            <property name="xalign">0</property>
            <property name="label" translatable="yes">label</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">False</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkButton" id="button1">
            <property name="label" translatable="yes">button</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <property name="yalign">0</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">False</property>
            <property name="position">1</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>
 
using System;
using Gtk;
 
namespace GTKBuilder {
    class MainClass {
 
        Window thisWnd = null;
        Builder thisObject = null;
        Button button1 = null;
        Label label1 = null;
 
        public static void Main (string[] args) {
            Application.Init ();
            MainClass tester = new MainClass();
            tester.Show();
            Application.Run ();
        }
 
        MainClass() {
            InitializeComponent();
        }
 
        private void InitializeComponent(){
            thisObject = new Gtk.Builder();
            thisObject.AddFromFile("tester.glade");
            thisWnd = (Window)thisObject.GetObject("window1");
            label1 = (Label)thisObject.GetObject("label1");
            button1 = (Button)thisObject.GetObject("button1");
            button1.Clicked += (object sender, EventArgs e) => {
                label1.Text = "Hello";
            };
            thisWnd.DeleteEvent += (o, args) => {
                Application.Quit();
            };
        }
 
        public void Show() {
            thisWnd.ShowAll();
        }
    }
}

No hay comentarios:

Publicar un comentario