2010-01-09 91 views
1

我tryig淡入Windows窗體使用C#但它似乎沒有工作後,我已經顯示的形式。在Ive展示之後是否可以更改窗體的不透明度?Windows窗體不透明後,顯示C#

代碼:

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

那麼你應該通過點擊勾號來接受答案。 – Benny 2010-01-09 12:17:33

回答

3

因爲你[R使用System.Timers.Timer這是一個多線程的定時器,在它的OnTimedEvent()調用另一個線程,這會導致異常產生的控制。

如果使用System.Windows.Forms.Timer,它將起作用。我測試過。

+0

它適用於上面代碼中提到的其他形式。除了Ive展示給他們之外沒有工作。 – user241949 2010-01-09 10:16:18

+0

如果您使用System.Windows.Forms.Timer,它將工作 – Benny 2010-01-09 10:32:54

+0

同意,不透明度分配*具有*要在UI線程上完成。避免現在通過保持不透明度在0和0.99之間而產生的閃爍 – 2010-01-09 10:38:09

1

使用您的代碼(並創建其他必需的Form類)時,第一次定時器觸發並調用事件處理函數as Benny suggests時,出現交叉線程異常。

您變更代碼來檢查InvokeRequired在定時器事件處理程序,並使用Invoke如果需要更改PropForm.Opacity,導致混濁的形式之後,改變顯示,按要求。

請注意,你可能要開始0Opacity增加逐步 - 否則你的形式將開始完全關閉固體和逐漸淡出

我會順便提一下,不透明度會對某些版本的Windows沒有任何影響,儘管你說你在其他地方有Opacity效果,所以在這種情況下不應該是這樣。

0

伊夫得到它沒有定時器工作:

 int Loop = 0; 

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

,但我似乎無法改變這個例子來淡入,而不是出。