GTK# 图像按钮在运行时不显示图像
Posted
技术标签:
【中文标题】GTK# 图像按钮在运行时不显示图像【英文标题】:GTK# Image Buttons not showing Images when Running 【发布时间】:2015-08-20 06:48:22 【问题描述】:我尝试在 GTK# (Xamarin Studio) 中使用图像按钮。我将图像设置为按钮,并且在 UI Builder 中图像即将出现。
但是当我运行程序时,按钮中没有图像
我在不同版本的 IDE 和不同平台(Mac 和 Windows)上试过这个
请帮忙
更新: 主窗口.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 文件夹中我可以找到这些文件
生成的.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);
【问题讨论】:
请张贴代码。这是 GTK+ 2 还是 GTK+ 3? @andlabs 感谢您的回复。它的 GTK+2.0。将很难在 SO 上发布所有代码,包括 UI 自动生成的代码。我已将整个项目上传到这里 s000.tinyupload.com/?file_id=79475520923978214151 请下载并检查 我们不想要你的整个项目。请写一个最小的例子来演示这个问题,然后我们可以尝试解决这个问题。 @ace 它是一个带有单个按钮的最小项目。问题是如果我在这里发布代码,我也需要发布设计器自动生成的代码,对吗?不管怎样,我会在这里发布 @ace 请看更新 【参考方案1】:据我所知,代码没有任何问题。这与 Gtk 如何主题化有关。
根据您的主题设置方式,您可能会看到或看不到图标。顺便说一句,Xamarin 使用的主题与默认使用的主题不同,因此从 Xamarin Studio (F5) 或命令行运行应用程序可能会产生不同的结果。
如果我没记错的话,在 windows 下,有一个默认的 Gtk 主题和一个 Windows 主题。有一个切换主题的工具,但不幸的是,我可以得到它。
编辑:
以下是运行主题的方法:
这是一个可以让你选择主题的小软件:http://sourceforge.net/projects/tumagcc/files/gtk2_prefs.exe/download
您还必须在网络上的某个地方下载 Gtk 主题(我尝试的第一个主题在 Windows 上很丑且无法使用,因此您可能需要在这里进行一些试验)。将主题(通常是 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 切换到默认引擎。
【讨论】:
感谢您的回答。我从命令行尝试了没有任何改变。这与 Windows 和 Mac 中发生的情况相同。如何更改主题? 为此目的,Gtk# 安装程序捆绑了一个应用程序。但是,奇怪的是,我的 Windows 计算机上有快捷方式,但程序本身却不见了。它被称为“Gtk 主题选择器”。 我尝试搜索整个 Mono 文件夹。我只能找到名为主题的文件夹,其中包含默认和 MS-Windows 条目 感谢您的更新。但是当我分发此软件(主要用于 Mac)时,我需要该软件自动占用操作系统的 UI(目前可以使用),但我需要分发此主题什么的。这将如何在 Mac 中工作。 我建议您将主题添加到您的解决方案中(在解决方案资源管理器中设置属性以将文件复制到输出文件夹)并添加 Gtk.Rc.Parse("在你初始化Gtk之后,你可以通过以下方式达到同样的效果。
//Application.Init(); - insert after this line
Gtk.Settings.Default.SetLongProperty ("gtk-button-images", 1, "");
【讨论】:
以上是关于GTK# 图像按钮在运行时不显示图像的主要内容,如果未能解决你的问题,请参考以下文章