2012-09-17 29 views
1

我正在尋找一種強制WindowsFormsHost控件在動畫完成移動後重繪自己的方法,但是我找不到解決方案。使用WindowsFormsHost在StoryBoard之後強制重繪WPF

我跟着一個例子按照http://bitsbobsetc.wordpress.com/2011/07/10/creating-a-sliding-panel-in-wpf/

在他只使用基本的WPF控件的例子,在我的WPF應用程序中的滑動面板。在我的滑動面板中,它的主要部分是WindowsFormsHost。我遇到的問題是動畫發生,因爲它應該,但WindowsFormsHost不會被繪製,直到用戶與其他東西交互後。就像主窗口刷新一樣,可以看到它。

當滑動面板被隱藏時,會發生同樣的事情。仍然顯示WindowsFormsHost,並且可以與用戶交互,直到用戶與其他人進行交互。

Animating WindowsFormsHost這似乎是一個已知的問題,但我並不過分關注動畫,只是顯示和隱藏面板。

下面是一些圖片來幫助描述當前行爲。

SidePanelClosed SidePanelOpenNotDrawn SidePanelOpenAndDrawn SidePanelClosedButStillDrawn

回答

0

通過研究這個問題,我發現,有跡象表明是可用於Storyboard類的一些事件。其中一個事件是Completed事件。

通過搭配來自使用.InvalidateVisual()的其他帖子的信息強制重繪WindowsFormsHost。這適用於動畫的滑出部分。對於後退,我只是簡單地隱藏了WindowsFormsHost,因爲它開始了關閉的動畫。這樣它就不會在面板關閉時留在用戶空間中。

的XAML:

<Storyboard x:Key="expandStoryBoard" 
    TargetProperty="RenderTransform.(TranslateTransform.X)" 
    AccelerationRatio=".4" 
    DecelerationRatio=".4" Completed="Storyboard_Completed"> 
     <DoubleAnimation Storyboard.TargetName="SidePanel" Duration="0:0:0.6" 
    From="0" To="250"> 
</Storyboard> 

後面的代碼:

private void Storyboard_Completed(object sender, EventArgs e) 
{ 
    this.InvalidateVisual(); 
} 

private void OpenPanel() 
{ 
    SidePanel.BeginStoryboard((Storyboard)this.Resources["expandStoryBoard"]); 
    expanded = !expanded; 
}