2017-05-21 6 views
0

Je travaille sur une petite application en Mono. J'aimerais avoir une image sur un arrière-plan et chaque fois que la taille de la fenêtre change, l'image doit être redessinée. Mais lorsque j'ajoute une méthode pour les chutes d'application ExposeEvent ou ConfigureEvent. Que pourrait-il être? Voici mon codeL'application GTK # se bloque après l'ajout d'un EventHandler

using System; 
using System.IO; 
using Gtk; 

public partial class AuthWind: Gtk.Window 
{ 
    FileStream bgstream; 
    public AuthWind() : base (Gtk.WindowType.Toplevel) 
    { 
     bgstream = File.Open ("noise-texture.png", System.IO.FileMode.Open); 
     Build(); 
     HBox mainCont = new HBox (false, 0); 
     ConfigureEvent += DrawBG; 
     Gdk.Pixbuf bgbuf = new Gdk.Pixbuf(bgstream, this.Allocation.Width, this.Allocation.Height); 
     Gdk.Pixmap bgmap = null; 
     Gdk.Pixmap useless = null; 
     bgbuf.RenderPixmapAndMask (out bgmap, out useless, 0); 
     Style st = new Style(); 
     st.SetBgPixmap (StateType.Normal, bgmap); 
     this.Style = st; 
    } 

    void DrawBG(object obj, EventArgs e) 
    { 
     Gdk.Pixbuf bgbuf = new Gdk.Pixbuf(bgstream, this.Allocation.Width, this.Allocation.Height); 
     Gdk.Pixmap bgmap = null; 
     Gdk.Pixmap useless = null; 
     bgbuf.RenderPixmapAndMask (out bgmap, out useless, 0); 
     Style st = new Style(); 
     st.SetBgPixmap (StateType.Normal, bgmap); 
     this.Style = st; 
    } 

    protected void OnDeleteEvent (object sender, DeleteEventArgs a) 
    { 
     Application.Quit(); 
     a.RetVal = true; 
    } 
} 

Répondre

0

Après une longue recherche, j'ai trouvé une solution. Tout d'abord pixbuf doit être créé une fois et enregistré en tant que variable de classe. Ensuite, dans le gestionnaire d'événements doivent être utilisés méthode ScaleSimple. C'est une méthode d'une classe Pixbuf. Cette méthode redimensionne un pixbuf et en crée un nouveau avec la largeur et la hauteur dont vous avez besoin. Comme pour l'événement ... Il faut ajouter le numéro de Gdk.Event dans la fenêtre avec laquelle vous voulez travailler. Après que l'événement de configuration doit fonctionner.

0

Vous gardez la bgstream ouverte, mais pas rembobiner le flux, peut-être que les choses se bloque?

De même, veuillez publier la trace complète de la pile pour le plantage.

+0

Il peut sembler bizarre, mais maintenant l'application compile et s'exécute normalement, mais ConfigureEvent ne démarre pas la méthode DrawBG. –