c# - unity - Botones de imagen GTK#que no muestran imágenes al ejecutar
www go mono com port80 (2)
Estoy tratando de usar los Botones de imagen en GTK # (Xamarin Studio). Configuré la Imagen en el botón y en el Generador de IU la imagen está subiendo.
Pero cuando ejecuto el programa no hay imagen en el botón.
Probé esto en diferentes versiones del IDE y en diferentes plataformas (Mac y Windows)
Por favor ayuda
Actualización: MainWindow.cs
using System;
using Gtk;
public partial class MainWindow: Gtk.Window
{
public MainWindow () : base (Gtk.WindowType.Toplevel)
{
Build ();
}
protected void OnDeleteEvent (object sender, DeleteEventArgs a)
{
Application.Quit ();
a.RetVal = true;
}
}
Dentro de la carpeta gtk-gui puedo encontrar estos archivos
generados.cs
// This file has been generated by the GUI designer. Do not modify.
namespace Stetic
{
internal class Gui
{
private static bool initialized;
internal static void Initialize (Gtk.Widget iconRenderer)
{
if ((Stetic.Gui.initialized == false)) {
Stetic.Gui.initialized = true;
}
}
}
internal class IconLoader
{
public static Gdk.Pixbuf LoadIcon (Gtk.Widget widget, string name, Gtk.IconSize size)
{
Gdk.Pixbuf res = widget.RenderIcon (name, size, null);
if ((res != null)) {
return res;
} else {
int sz;
int sy;
global::Gtk.Icon.SizeLookup (size, out sz, out sy);
try {
return Gtk.IconTheme.Default.LoadIcon (name, sz, 0);
} catch (System.Exception) {
if ((name != "gtk-missing-image")) {
return Stetic.IconLoader.LoadIcon (widget, "gtk-missing-image", size);
} else {
Gdk.Pixmap pmap = new Gdk.Pixmap (Gdk.Screen.Default.RootWindow, sz, sz);
Gdk.GC gc = new Gdk.GC (pmap);
gc.RgbFgColor = new Gdk.Color (255, 255, 255);
pmap.DrawRectangle (gc, true, 0, 0, sz, sz);
gc.RgbFgColor = new Gdk.Color (0, 0, 0);
pmap.DrawRectangle (gc, false, 0, 0, (sz - 1), (sz - 1));
gc.SetLineAttributes (3, Gdk.LineStyle.Solid, Gdk.CapStyle.Round, Gdk.JoinStyle.Round);
gc.RgbFgColor = new Gdk.Color (255, 0, 0);
pmap.DrawLine (gc, (sz / 4), (sz / 4), ((sz - 1) - (sz / 4)), ((sz - 1) - (sz / 4)));
pmap.DrawLine (gc, ((sz - 1) - (sz / 4)), (sz / 4), (sz / 4), ((sz - 1) - (sz / 4)));
return Gdk.Pixbuf.FromDrawable (pmap, pmap.Colormap, 0, 0, 0, 0, sz, sz);
}
}
}
}
}
internal class ActionGroups
{
public static Gtk.ActionGroup GetActionGroup (System.Type type)
{
return Stetic.ActionGroups.GetActionGroup (type.FullName);
}
public static Gtk.ActionGroup GetActionGroup (string name)
{
return null;
}
}
}
Mainwindow.cs
// This file has been generated by the GUI designer. Do not modify.
public partial class MainWindow
{
private global::Gtk.Fixed fixed1;
private global::Gtk.Button button1;
protected virtual void Build ()
{
global::Stetic.Gui.Initialize (this);
// Widget MainWindow
this.Name = "MainWindow";
this.Title = global::Mono.Unix.Catalog.GetString ("MainWindow");
this.WindowPosition = ((global::Gtk.WindowPosition)(4));
// Container child MainWindow.Gtk.Container+ContainerChild
this.fixed1 = new global::Gtk.Fixed ();
this.fixed1.Name = "fixed1";
this.fixed1.HasWindow = false;
// Container child fixed1.Gtk.Fixed+FixedChild
this.button1 = new global::Gtk.Button ();
this.button1.CanFocus = true;
this.button1.Name = "button1";
this.button1.UseUnderline = true;
this.button1.Label = global::Mono.Unix.Catalog.GetString ("GtkButton");
global::Gtk.Image w1 = new global::Gtk.Image ();
w1.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-delete", global::Gtk.IconSize.Menu);
this.button1.Image = w1;
this.fixed1.Add (this.button1);
global::Gtk.Fixed.FixedChild w2 = ((global::Gtk.Fixed.FixedChild)(this.fixed1 [this.button1]));
w2.X = 153;
w2.Y = 137;
this.Add (this.fixed1);
if ((this.Child != null)) {
this.Child.ShowAll ();
}
this.DefaultWidth = 400;
this.DefaultHeight = 300;
this.Show ();
this.DeleteEvent += new global::Gtk.DeleteEventHandler (this.OnDeleteEvent);
}
}
Puede lograr el mismo efecto colocando lo siguiente después de inicializar Gtk.
//Application.Init(); - insert after this line
Gtk.Settings.Default.SetLongProperty ("gtk-button-images", 1, "");
Que yo sepa, no hay nada de malo en el código. Esto está relacionado con la temática de Gtk.
Dependiendo de cómo estén configurados tus temas, puedes ver el ícono o no. Por cierto, el tema utilizado por Xamarin es diferente del que se usa de forma predeterminada, por lo que ejecutar su aplicación desde Xamarin Studio (F5) o desde la línea de comandos puede dar resultados diferentes.
Si recuerdo bien, debajo de windows, hay un tema predeterminado de Gtk y un tema de Windows. Hay una herramienta para cambiar temas, pero desafortunadamente, puedo tenerla en mis manos.
EDITAR:
Aquí es cómo hacer que los temas se ejecuten:
Aquí hay un pequeño software que le permitirá seleccionar un tema: http://sourceforge.net/projects/tumagcc/files/gtk2_prefs.exe/download
También tendrás que descargar un tema Gtk en algún lugar de la web (el primero que probé resultó ser feo e inutilizable en Windows, por lo que probablemente tengas que experimentar un poco aquí). Extraiga el tema (generalmente un archivo tar.gz) a su instalación de Gtk en compartir / temas. Asegúrese de que la estructura del directorio, una vez que el tema extraído es como:
{Gtk}/share/themes/MyFantasticTheme/Gtk-2.0
Luego inicie el pequeño software como Administrador, seleccione su tema en la lista y haga clic en Aceptar. Ahora ejecuta tu aplicación desde fuera de Xamarin Studio.
EDITAR # 2:
Después de algunos toques violentos, descubrí una forma que muestra iconos y etiquetas dentro de los botones:
Application.Init ();
Gtk.Settings.Default.ThemeName = "Theme/gtk-2.0/gtkrc";
Gtk.Rc.Parse ("./Theme/gtk-2.0/gtkrc");
Mi tema consiste en una sola línea dentro de Theme/gtk-2.0/gtkrc
(la documentación sobre el archivo gtkrc se puede encontrar fácilmente, ya que no es específica de Gtk #):
gtk-button-images = 1
Lo que creo que sucede es que un tema predeterminado se establece de alguna manera cuando se inicia la aplicación, y este tema predeterminado no se puede anular. ¿Por que es esto entonces? Tal vez porque el tema predeterminado se ejecuta con un motor Gtk específico para ventanas que no permite iconos en los botones. Al anular el tema predeterminado, creo que cambias Gtk al motor predeterminado.