1

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

我按照http://bitsbobsetc.wordpress.com/2011/07/10/creating-a-sliding-panel-in-wpf/在我的 WPF 应用程序中有一个滑动面板的示例

在示例中,他仅使用基本的 wpf 控件。在我的滑动面板中,它的主要部分是 WindowsFormsHost。我遇到的问题是动画按原样发生,但 WindowsFormsHost 直到用户与其他东西交互后才会被绘制。就像刷新主窗口使其可见。

当滑动面板被隐藏时也会发生同样的事情。WindowsFormsHost 仍然显示并且可以交互,直到用户与其他东西交互。

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

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

侧面板关闭 SidePanelOpenNotDrawn 侧面板打开并绘制 侧面板关闭但仍然绘制

4

1 回答 1

1

通过研究这个问题,我发现课程中有一些活动可用 Storyboard。事件之一是Completed事件。

通过将其他帖子中的信息联系起来,.InvalidateVisual()这会强制重绘WindowsFormsHost. 这适用于动画的滑出部分。对于向后滑动,我只是简单地隐藏了它,WindowsFormsHost因为它开始关闭动画。这样,当面板关闭时,它就不会在用户空间中徘徊。

xml:

<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;
}
于 2012-10-05T14:13:44.953 回答