tec*_*hno 16 c# gtk mono gtk# xamarin
我试图在GTK中使用图像按钮#(Xamarin Studio).我将图像设置为按钮,在UI Builder中,图像即将出现.

但是当我运行程序时,按钮中没有图像

我在不同版本的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;
}
}
Run Code Online (Sandbox Code Playgroud)
在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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,代码没有任何问题.这与Gtk主题有关.
根据主题的设置方式,您可能会看到图标.顺便说一下,Xamarin使用的主题与默认使用的主题不同,因此从Xamarin Studio(F5)或命令行运行应用程序可能会产生不同的结果.
如果我记得很清楚,在Windows下,有一个默认的Gtk主题和一个Windows主题.有一个切换主题的工具,但不幸的是,我可以得到它.
编辑:
以下是如何运行主题:
这是一个可以让你选择主题的小软件:http://sourceforge.net/projects/tumagcc/files/gtk2_prefs.exe/download
你还必须在网络上的某个地方下载一个Gtk主题(我试过的第一个在Windows上变得丑陋且无法使用,所以你可能需要在这里进行一些实验).将主题(通常是tar.gz文件)解压缩到共享/主题下的Gtk安装.提取主题后,确保目录结构如下:
{Gtk}/share/themes/MyFantasticTheme/Gtk-2.0
Run Code Online (Sandbox Code Playgroud)
然后以管理员身份启动小软件,在列表中选择您的主题,然后单击"确定".现在从Xamarin Studio外部运行您的应用程序.
编辑#2:
经过一番摆弄后,我发现了一种在按钮中显示图标和标签的方法:
Application.Init ();
Gtk.Settings.Default.ThemeName = "Theme/gtk-2.0/gtkrc";
Gtk.Rc.Parse ("./Theme/gtk-2.0/gtkrc");
Run Code Online (Sandbox Code Playgroud)
我的主题包含一行内容Theme/gtk-2.0/gtkrc(关于gtkrc文件的文档很容易找到,因为它不是Gtk#specific):
gtk-button-images = 1
Run Code Online (Sandbox Code Playgroud)
我认为发生的是在应用程序启动时以某种方式设置默认主题,并且不能覆盖此默认主题.为什么会这样?也许是因为默认主题使用特定的Gtk引擎运行,不允许按钮中的图标.通过覆盖默认主题,我相信您将Gtk切换到默认引擎.
| 归档时间: |
|
| 查看次数: |
2139 次 |
| 最近记录: |