Кнопки GTK # Image, не отображающие изображения при запуске
Я пытаюсь использовать кнопки изображения в GTK # (Xamarin Studio). Я устанавливаю изображение на кнопку, а в построителе пользовательского интерфейса изображение приближается.
![enter image description here]()
Но когда я запускаю программу, в кнопке нет изображения
![enter image description here]()
Я пробовал это в разных версиях среды IDE и на разных платформах (Mac и Windows)
Пожалуйста, помогите
Обновление:
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;
}
}
В папке gtk-gui я могу найти эти файлы
generated.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);
}
}
Ответы
Ответ 1
Насколько я знаю, в коде нет ничего плохого. Это связано с тем, как Gtk theming.
В зависимости от того, как настроены ваши темы, вы можете увидеть значок или нет. Кстати, тема, используемая Xamarin, отличается от темы, используемой по умолчанию, поэтому запуск приложения из Xamarin Studio (F5) или из командной строки может дать разные результаты.
Если я хорошо помню, под окнами, есть тема Gtk по умолчанию и тема Windows. Там есть инструмент для переключения тем, но, к сожалению, я могу его понять.
ИЗМЕНИТЬ:
Здесь, как получить темы:
Вот небольшое программное обеспечение, которое позволит вам выбрать тему: http://sourceforge.net/projects/tumagcc/files/gtk2_prefs.exe/download
Вам также придется загружать тему Gtk где-то в Интернете (первый, который я попробовал, оказался уродливым и непригодным для использования в окнах, поэтому вам, вероятно, придется немного поэкспериментировать). Извлеките тему (обычно файл tar.gz) в свою установку Gtk в разделе share/themes. Убедитесь, что структура каталога, как только извлеченная тема выглядит следующим образом:
{Gtk}/share/themes/MyFantasticTheme/Gtk-2.0
Затем запустите небольшое программное обеспечение в качестве администратора, выберите свою тему в списке и нажмите "ОК". Теперь запустите приложение снаружи Xamarin Studio.
ИЗМЕНИТЬ № 2:
После некоторых попыток я обнаружил способ отображения значков и меток внутри кнопок:
Application.Init ();
Gtk.Settings.Default.ThemeName = "Theme/gtk-2.0/gtkrc";
Gtk.Rc.Parse ("./Theme/gtk-2.0/gtkrc");
Моя тема состоит из одной строки внутри Theme/gtk-2.0/gtkrc
(документация о файле gtkrc может быть легко найдена, так как она не специфична для Gtk #):
gtk-button-images = 1
Что я думаю, так это то, что тема по умолчанию каким-то образом задается при запуске приложения, и эта тема по умолчанию не может быть переопределена. Почему это так? Возможно, потому что тема по умолчанию работает с определенным движком Gtk для окон, который не позволяет значкам в кнопках. Переопределяя тему по умолчанию, я считаю, что вы переключите Gtk на механизм по умолчанию.
Ответ 2
Вы можете добиться такого же эффекта, поставив следующее после инициализации Gtk.
//Application.Init(); - insert after this line
Gtk.Settings.Default.SetLongProperty ("gtk-button-images", 1, "");