2010-06-22 1 views
3

Ну я работал над простым приложением для запуска/остановки и перезапуска моей ЛАМПЫ в моно (только, чтобы знать развитие GUI с моно немного больше), так чтобы иметь меньше кнопок Я решил создать одну кнопку для запуска и остановки серверов. В GUI-дизайнере я добавил кнопку запуска с иконкой, проблема в том, что обновление ярлыка кнопки легко, но изменение изображения на Stock.MediaStop - небольшая проблема. Итак, как изменить изображение запаса в кнопке на событии клика (оно не измеряет, на каком именно событии оно на самом деле). Вот некоторый код: Графический интерфейс XML для кнопки:Как обновить изображение в gtk.Button с GTK #

<widget class="Gtk.Button" id="button1"> 
     <property name="MemberName" /> 
     <property name="CanFocus">True</property> 
     <property name="Type">TextAndIcon</property> 
     <property name="Icon">stock:gtk-media-play Menu</property> 
     <property name="Label" translatable="yes">Start</property> 
     <property name="UseUnderline">True</property> 
     <signal name="Clicked" handler="OnMysqlServerStartStop" /> 
</widget> 

А вот как MediaDevelop сделаны кнопки Stock с пользовательским текстом:

// Container child hbox1.Gtk.Box+BoxChild 
     this.hbuttonbox1 = new Gtk.HButtonBox(); 
     this.hbuttonbox1.Name = "hbuttonbox1"; 
     // Container child hbuttonbox1.Gtk.ButtonBox+ButtonBoxChild 
     this.button1 = new Gtk.Button(); 
     this.button1.CanFocus = true; 
     this.button1.Name = "button1"; 
     this.button1.UseUnderline = true; 
     // Container child button1.Gtk.Container+ContainerChild 
     Gtk.Alignment w2 = new Gtk.Alignment(0.5F, 0.5F, 0F, 0F); 
     // Container child GtkAlignment.Gtk.Container+ContainerChild 
     Gtk.HBox w3 = new Gtk.HBox(); 
     w3.Spacing = 2; 
     // Container child GtkHBox.Gtk.Container+ContainerChild 
     Gtk.Image w4 = new Gtk.Image(); 
     w4.Pixbuf = Stetic.IconLoader.LoadIcon(this, "gtk-media-play", Gtk.IconSize.Menu, 16); 
     w3.Add(w4); 
     // Container child GtkHBox.Gtk.Container+ContainerChild 
     Gtk.Label w6 = new Gtk.Label(); 
     w6.LabelProp = Mono.Unix.Catalog.GetString("Start"); 
     w6.UseUnderline = true; 
     w3.Add(w6); 
     w2.Add(w3); 
     this.button1.Add(w2); 
     this.hbuttonbox1.Add(this.button1); 

ответ

2

Я могу понять, почему вы испытываете так много проблем здесь. Я думал, что вы можете просто установить свойства изображения и текста кнопки, но, похоже, у вас может быть ярлык или изображение, но не оба. Метка перезаписывает изображение. Я думаю, что изображение будет отображаться только в том случае, если параметры темы запросят его. То же самое относится к этикетке. У вас может быть комбинация обоих, только метка или только изображение. Все задано темой, которую вы используете.

Вы на правильном пути здесь, этот пример кода должен ответить на ваш запрос.

using System; 
using Gtk; 

namespace TogglePlay 
{ 
    public class MainClass 
    { 
     private bool stop = false; 
     private Image image; 
     private Label label; 

     public MainClass() 
     { 
      Button button = new Button(); 
      VBox box = new VBox(); 
      image = new Image(Stock.MediaPlay, IconSize.Button); 
      box.PackStart(image, true, true, 0); 
      label = new Label("Start"); 
      box.PackStart(label, true, true, 0); 
      button.Add(box); 
      button.Clicked += OnButtonClicked; 
      Window window = new Window("LAMP light"); 
      window.Add(button); 
      window.DeleteEvent += DeleteWindow; 
      window.ShowAll(); 
     } 


     private void DeleteWindow(object obj, DeleteEventArgs args) 
     { 
      Gtk.Application.Quit(); 
     } 

     public void OnButtonClicked(object widget, EventArgs args) 
     { 
      if (!stop) { 
       stop = true; 
       image.Stock = Stock.MediaStop; 
       label.Text = "Stop"; 
      } else { 
       stop = false; 
       image.Stock = Stock.MediaPlay; 
       label.Text = "Start"; 
      } 
     } 


     public static void Main(String[] args) 
     { 
      Gtk.Application.Init(); 
      MainClass mainClass = new MainClass(); 
      Gtk.Application.Run(); 
     } 
    } 
}