2013-04-07 77 views
0

我在WPF中創建了一個彈出窗口,它顯示並隱藏了500毫秒的淡出動畫。在彈出窗口動畫運行時WPF窗口消息未觸發

當TextBox控件的PreviewMouseUp被觸發時彈出顯示,並且當TextBox的焦點丟失時隱藏。

問題是,如果我有兩個這些文本框,彈出窗口的動畫似乎阻止所有窗口消息發送到主窗口,而動畫正在進行。第二個TextBox的PreviewMouseUp僅在第一個TextBox的Popup的動畫完成後才被觸發。

有沒有辦法讓彈出窗口的淡入淡出動畫不會在動畫運行時阻塞窗口消息?

示例XAML文件:

 <Window x:Class="WpfApplication4.MainWindow" 
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       Title="MainWindow" Height="350" Width="525"> 
      <Grid> 
       <TextBox HorizontalAlignment="Left" Height="23" Margin="22,26,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120" PreviewMouseUp="TextBox_PreviewMouseUp_1" LostFocus="TextBox_LostFocus_1"/> 
       <TextBox HorizontalAlignment="Left" Height="23" Margin="22,54,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120" PreviewMouseUp="TextBox_PreviewMouseUp_1" LostFocus="TextBox_LostFocus_1"/> 

      </Grid> 
     </Window> 

示例代碼文件:

 using System; 
     using System.Collections.Generic; 
     using System.Linq; 
     using System.Text; 
     using System.Threading.Tasks; 
     using System.Windows; 
     using System.Windows.Controls; 
     using System.Windows.Controls.Primitives; 
     using System.Windows.Data; 
     using System.Windows.Documents; 
     using System.Windows.Input; 
     using System.Windows.Media; 
     using System.Windows.Media.Animation; 
     using System.Windows.Media.Imaging; 
     using System.Windows.Navigation; 
     using System.Windows.Shapes; 

     namespace WpfApplication4 
     { 
      /// <summary> 
      /// Interaction logic for MainWindow.xaml 
      /// </summary> 
      public partial class MainWindow : Window 
      { 
       public MainWindow() 
       { 
        InitializeComponent(); 
       } 

       private void TextBox_PreviewMouseUp_1(object sender, MouseButtonEventArgs e) 
       { 
        Popup p = new Popup(); 
        p.Width = 100; 
        p.Height = 100; 
        p.Placement = PlacementMode.Left; 
        p.PlacementTarget = (TextBox)sender; 
        p.Child = new Border(); 
        p.IsOpen = true; 
        ((TextBox)sender).Tag = p; 
       } 

       private void TextBox_LostFocus_1(object sender, RoutedEventArgs e) 
       { 
        Popup p = (Popup)((TextBox)sender).Tag; 
        DoubleAnimation anim = new DoubleAnimation(100, 0, new Duration(new TimeSpan(0, 0, 1))); 
        p.BeginAnimation(WidthProperty, anim); 
       } 

      } 
     } 

如果快速單擊文本框都,您注意到其他的彈出窗口將不會出現(與文本不獲得焦點),而動畫正在運行。

到目前爲止,我發現的情況是,如果動畫是非常密集的(高幀率),窗口消息將被阻止,直到動畫完成。如果我將應用程序幀率設置爲較低的值,例如30FPS,那麼問題就會消失。但對我來說這不是一種選擇,因爲我不希望動畫儘可能流暢。

+0

我幾乎可以肯定,動畫不會阻止任何窗口消息。你的問題似乎是另一回事,你能提供一個你的問題的小例子嗎? – dowhilefor 2013-04-07 20:29:48

+0

我的項目是相當大的..必須創建一個較小的例子然後..但現在不得不去睡覺 - 明天會發布。 – Jaska 2013-04-07 20:32:09

+0

好吧,我剛剛發佈了一個例子 – Jaska 2013-04-07 20:47:33

回答

1

發生這種情況是因爲我彈出了彈出窗口的邊界 - 當窗口大小頻繁變化時,會生成大量窗口消息。 (在動畫持續期間,哪個課程阻塞了應用程序的整個窗口消息泵)。

因此,解決方案不是爲彈出窗口本身設置動畫,而是彈出窗口的子控件(例如面板),並將彈出窗口設置爲允許透明度,以便獲得相同的效果,但實際上並非動畫實際窗口尺寸。

+0

我不確定動畫大小的目的是什麼,但您可以使用縮放轉換來做同樣的事情,並且不會阻塞事件管道。如果你想知道如何從代碼後面或在XAML中渲染變換,請告訴我。乾杯 – 2014-07-18 02:46:35