2010-06-22 29 views
3

Eh bien, je travaillais sur une application simple pour démarrer/arrêter et redémarrer mon LAMP en mono (juste pour apprendre à connaître le développement de l'interface graphique avec un peu plus), pour avoir moins de boutons J'ai décidé d'avoir un bouton pour démarrer et arrêter les serveurs. Dans le concepteur de GUI j'ai ajouté un bouton de démarrage avec l'icône, le problème est que la mise à jour de l'étiquette du bouton est facile, mais le changement de l'image à Stock.MediaStop est un peu un problème. Alors Comment changer l'image de stock dans un bouton sur l'événement de clic (il ne mesure pas sur quel type d'événement il est réellement). Voici un code: Le XML GUI pour un bouton:Comment mettre à jour l'image dans gtk.Button avec 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> 

Et voici comment MediaDevelop fait le bouton Stock avec un texte personnalisé:

// 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); 

Répondre

2

je peux voir pourquoi vous avez tant de mal ici. Je pensais que vous pouviez simplement définir les propriétés de l'image et du texte du bouton, mais il semble que vous puissiez afficher une étiquette ou une image, mais pas les deux. L'étiquette écrase l'image. Je pense que l'image montrera seulement si les paramètres de thème le demandent. La même chose s'applique à l'étiquette. Vous pouvez avoir une combinaison des deux, seulement une étiquette ou seulement une image. Tout ensemble par le thème de votre utilisation.

Vous êtes sur la bonne voie ici, cet exemple de code devrait répondre à votre requête.

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(); 
     } 
    } 
}