如何在单声道(GTK)中更改窗口背景颜色?

时间:2013-04-02 07:50:02

标签: c# mono gtk gtk#

我在gtk中有一个窗口,其中包含一个Build()函数,如下所示:

protected virtual void Build()
{
    global::Stetic.Gui.Initialize(this);
    // Widget Client.Forms.Notification
    this.Name = "Client.Forms.Notification";
    this.Title = "Notification";
    this.TypeHint = Gdk.WindowTypeHint.Normal;
    //this.TypeHint = ((global::Gdk.WindowTypeHint)(4));
    this.WindowPosition = ((global::Gtk.WindowPosition)(4));
    // Container child Client.Forms.Notification.Gtk.Container+ContainerChild
    this.vbox1 = new global::Gtk.VBox();
    this.vbox1.Name = "vbox1";
    this.vbox1.Spacing = 6;
    // Container child vbox1.Gtk.Box+BoxChild
    this.label1 = new global::Gtk.Label();
    this.label1.HeightRequest = 20;
    this.label1.Name = "label1";
    this.label1.LabelProp = "Notification";
    this.vbox1.Add(this.label1);
    global::Gtk.Box.BoxChild w1 = ((global::Gtk.Box.BoxChild)(this.vbox1[this.label1]));
    w1.Position = 0;
    w1.Expand = false;
    w1.Fill = false;
    // Container child vbox1.Gtk.Box+BoxChild
    this.hbox1 = new global::Gtk.HBox();
    this.hbox1.Name = "hbox1";
    this.hbox1.Spacing = 6;
    // Container child hbox1.Gtk.Box+BoxChild
    this.image1 = new global::Gtk.Image();
    this.image1.Name = "image1";
    this.image1.Pixbuf = global::Gdk.Pixbuf.LoadFromResource("Client.Resources.icon.png");
    this.hbox1.Add(this.image1);
    global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.hbox1[this.image1]));
    w2.Position = 0;
    w2.Expand = false;
    w2.Fill = false;
    // Container child hbox1.Gtk.Box+BoxChild
    this.label2 = new global::Gtk.Label();
    this.label2.Name = "label2";
    this.label2.WidthRequest = 260;
    this.label2.Wrap = true;
    this.label2.LabelProp = "Description";
    this.hbox1.Add(this.label2);
    global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.hbox1[this.label2]));
    w3.Position = 1;
    w3.Expand = false;
    w3.Fill = false;
    this.vbox1.Add(this.hbox1);
    global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.vbox1[this.hbox1]));
    w4.Position = 1;
    w4.Expand = false;
    w4.Fill = false;
    this.label1.ModifyBase(Gtk.StateType.Normal, Core.fromColor(System.Drawing.Color.Orange));
    this.ModifyBase(Gtk.StateType.Normal, Core.fromColor(System.Drawing.Color.Orange));
    this.vbox1.ModifyBase(Gtk.StateType.Normal, Core.fromColor(System.Drawing.Color.Orange));
    root = new Gtk.EventBox();
    root.Add(this.vbox1);
    this.Decorated = false;
    this.Add(root);
    if ((this.Child != null))
    {
        this.Child.ShowAll();
    }
    this.DefaultWidth = 460;
    this.DefaultHeight = 220;
}

(整个窗口的源代码:https://github.com/pidgeonproject/pidgeon/blob/master/Forms/Notification.cs

正如您所看到的那样,正在调用

this.ModifyBase(Gtk.StateType.Normal, Core.fromColor(System.Drawing.Color.Orange));

应将背景更改为橙色,但不是。

我试图在窗口元素上插入更多类似的函数,但它也不起作用,是否有人知道如何更改窗口的背景颜色?

我想要做的是创建一个没有装饰(只有一个矩形)的小窗口,其中包含特定颜色和一些文本。这个窗口应该是透明的(现在可以工作)并且应该有一个图片和2个带文本的标签并且在点击时消失 - 所有这些现在都可以工作,我不能将背景从灰色更改为更好的颜色。我会很高兴得到的答案可以让我用其他方式做到这一点(我可以考虑用绘图区域创建一个小表格并用颜色绘制它然后再绘制文本,但这对我来说听起来很复杂对于我想做的事情这么简单。)

注意: mono正在使用GTK 2,而.Net的GTK#版本正在使用2.12.20

3 个答案:

答案 0 :(得分:4)

尝试使用Event Box。似乎工作

答案 1 :(得分:1)

对于GTK + 2,你需要像这样创建一个gtk资源:

char *my_custom_style = "style \"my-style-name\" { bg[NORMAL] = \"#339933\" }\nclass \"GtkWindow\" style \"my-style-name\"";

然后在初始化后启动程序时加载资源:

gtk_rc_parse_string (my_custom_style);

现在任何GtkWindow都会使用您的自定义样式作为背景。

Gtk Resource Files

的C文档

编辑:

如果您只想更改一个特定窗口,则可以将自定义样式字符串更改为

char *my_custom_style="style \"my-style-name\" { bg[NORMAL] = \"#339933\" }\nwidget \"my-custom-window\" style= \"my-style-name\"';

然后使用

设置要更改背景的窗口的名称
gtk_widget_set_name (GTK_WIDGET (my_window), "my-custom-window");

编辑2:

以下是Gtk#Rc解析函数的文档:

http://buttle.shangorilla.com/1.1/handlers/monodoc.ashx?link=M%3aGtk.Rc.Parse(System.String)

答案 2 :(得分:0)

文档(针对C API)说不推荐使用gtk_widget_modify_color(),而新编写的代码应该使用gtk_widget_override_background_color(),所以试试吧。

GTK +中的覆盖主题虽然很难,但3.0 API真的听起来好像它支持你想做的事情。

不幸的是,目前无法自己测试。