2010-01-09 6 views
1

Je suis en train d'essayer de faire un fondu de Windows en utilisant C# mais cela ne semble pas fonctionner après avoir montré le formulaire. Est-il possible de changer l'opacité des formes après l'avoir montré?Windows Forms Opacité après affichage - C#

code:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

using System.Timers; 

namespace ToolStrip 
{ 
    public partial class Form1 : Form 
    { 
     Form ToolForm = new ToolForm(); 
     Form PropForm = new PropertyGrid(); 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      ToolForm.FormBorderStyle = FormBorderStyle.FixedToolWindow; 
      ToolForm.Owner = this; 
      ToolForm.Show(); 
      ToolForm.Location = new Point(50, 50); 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      PropForm.FormBorderStyle = FormBorderStyle.FixedToolWindow; 
      PropForm.Owner = this; 
      PropForm.Show(); 
      PropForm.Location = new Point(50, 50); 

      System.Timers.Timer aTimer = new System.Timers.Timer(10000); 

      aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
      aTimer.Interval = 2000; 
      aTimer.Enabled = true; 

      Console.WriteLine("Press the Enter key to exit the program."); 
      Console.ReadLine(); 
     } 

     private void OnTimedEvent(object source, ElapsedEventArgs e) 
     { 
      PropForm.Opacity = PropForm.Opacity - 0.25; 
      Console.WriteLine(PropForm.Opacity); 
     } 
    } 
} 
+0

alors vous devriez accepter la réponse en cliquant sur la coche. – Benny

Répondre

3

parce que vous r en utilisant System.Timers.Timer qui est une minuterie multithread, dans son OnTimedEvent() appelle le contrôle créé par un autre thread, ce qui cause une exception.

Si vous utilisez System.Windows.Forms.Timer, cela fonctionnera. j'ai testé.

+0

Cela fonctionne sur les autres formes que j'ai mentionnées dans le code ci-dessus. Sauf qu'il ne fonctionne pas après les avoir montrés. – user241949

+0

Si vous utilisez System.Windows.Forms.Timer, cela fonctionnera – Benny

+0

D'accord, l'affectation d'opacité * doit être effectuée sur le thread de l'interface utilisateur. Évitez le scintillement que vous obtenez maintenant en gardant l'opacité entre 0 et 0,99 –

1

En utilisant votre code (et en créant les autres classes Form nécessaires), j'obtiens une exception de thread-threading la première fois que le temporisateur se déclenche et que le gestionnaire d'événements est appelé, as Benny suggests.

Apporter des modifications à votre code pour vérifier InvokeRequired dans le gestionnaire d'événements de minuterie et utiliser Invoke si nécessaire pour changer PropForm.Opacity, les résultats dans l'opacité changeant après la forme est représentée, selon les besoins.

Notez que vous voulez sans doute commencer par un Opacity de 0 et augmentation progressivement - sinon votre forme va commencer complètement solide et progressivement disparaître à

Je mentionne en passant que Opacité sera n'ont pas d'effet sur certaines versions de Windows, bien que vous disiez que vous avez des effets d'Opacité fonctionnant ailleurs, cela ne devrait donc pas être le cas dans ce cas.

0

Ive obtenu à travailler sans minuteries:

 int Loop = 0; 

     for (Loop = 100; Loop >= 5; Loop -= 10) 
     { 
      this.PropForm.Opacity = Loop/95.0; 
      this.PropForm .Refresh(); 
      System.Threading.Thread.Sleep(100); 
     } 

mais je ne peux pas semblent changer cet exemple fondu au lieu de sortir.