使用WindowsFormsHost WPF强制重绘StoryBoard之后

时间:2012-09-17 18:47:32

标签: c# wpf windowsformshost

我正在寻找一种方法来强制WindowsFormsHost控件在动画完成移动后重绘自己,但我找不到解决方案。

我按照一个示例,按照http://bitsbobsetc.wordpress.com/2011/07/10/creating-a-sliding-panel-in-wpf/

在我的WPF应用程序中设置了一个滑动面板

在示例中,他仅使用基本的wpf控件。在我的滑动面板中,它的主要部分是WindowsFormsHost。我遇到的问题是动画应该发生,但WindowsFormsHost在用户与其他内容交互之后才会被绘制。就像刷新主窗口一样可以看到它。

当要隐藏滑动面板时会发生同样的事情。 WindowsFormsHost仍然显示,可以与用户交互其他内容进行交互。

Animating WindowsFormsHost来看,这似乎是一个已知问题,但我并不过分担心动画,只是显示和隐藏面板。

以下是一些有助于描述当前行为的图片。

SidePanelClosed SidePanelOpenNotDrawn SidePanelOpenAndDrawn SidePanelClosedButStillDrawn

1 个答案:

答案 0 :(得分: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;
}