当消息窗口关闭时,我们的应用程序使用动画淡出消息窗口。为此,我们重写OnClosing,如果我们还没有完成我们的动画,我们取消关闭并启动动画。当动画完成后,我们关闭窗口。基于我在网上看到的,这似乎是一个相当普遍的模式,因为关闭和关闭都不是可路由的事件。
问题是,我们偶尔会看到一个窗口被“卡住”--动画似乎不会发生,所以“已完成”的标志永远不会被设置,而窗口只是坐在那里,取消任何关闭事件。有时候,动画最终会启动,窗口也会关闭,但其他时候,它似乎永远被卡住了(尽管很明显,您无法判断sure...halting问题和所有这些……)。
有没有人想过为什么即使在调用Begin()之后,故事板也不会被启动呢?如果不能深入研究Storyboard的代码/数据结构,感觉就像是在等待什么事情发生才真正开始,而这从来没有发生过。
以下是我目前排除的一些可能性:
话虽如此,以下是一些可能有所贡献的东西:
correctly.
我最强烈地怀疑最后一项,因为它是最近添加的,而且在更改之前从未报告/注意到这种行为(虽然我不能确切地说,在更改之前从未发生过这种行为)。但其他与GUI/窗口相关的事件仍能正常工作,淡出动画逻辑大部分时间都能工作。
最后,下面是我们完成关闭动画的代码的主要内容:
public class MyWindow : Window {
private bool _storyBoardCompleted;
private Storyboard _closingStoryBoard;
protected Storyboard GetClosingStoryBoard()
{
Grid mainGrid = (Grid)FindName("MainGrid");
DoubleAnimation closingAnimation = new DoubleAnimation();
closingAnimation.From = 1;
closingAnimation.To = 0;
closingAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(500));
Storyboard.SetTarget(closingAnimation, mainGrid);
Storyboard.SetTargetProperty(closingAnimation, new PropertyPath(OpacityProperty));
Storyboard storyboard = new Storyboard();
storyboard.Children.Add(closingAnimation);
storyboard.Completed += StoryboardCompleted;
return storyboard;
}
private void StoryboardCompleted(object sender, EventArgs e)
{
_storyBoardCompleted = true;
Close();
}
protected override void OnClosing(CancelEventArgs e)
{
if (_closingStoryBoard == null)
{
_closingStoryBoard = GetClosingStoryBoard();
_closingStoryBoard.Begin();
}
if (!_storyBoardCompleted)
{
e.Cancel = true;
}
}
}编辑:每当我们打开两个窗口时,问题似乎就会弹出,并且在显示第二个窗口之前关闭第一个窗口。实质上:
window1.Show()
window1.Close()
window2.Show()此时,如果我们试图关闭window2,它将取消上面代码中的关闭,但是动画不会开始(因此出现了问题)。如果我们稍后调用window2.Close()后面紧跟着window3.Show() (即显示第三个窗口),那么window2的动画就完成了,窗口关闭了--但是window3却陷入了相同的状态。因此,一旦我们处于这种状态,这种行为几乎就会从一个窗口传递到另一个窗口。
编辑:我排除了另一种可能性--我想知道第二个窗口的“淡入”故事板是否与第一个窗口的“淡出”故事板有某种冲突,并以某种方式影响了第二个窗口的淡出。但是即使在移除淡入的故事板之后,问题也会发生。此外,如果我用半秒的调度定时器替换淡出的故事板(即只是延迟关闭,没有动画),那么问题就完全解决了。只是检查一下是不是和动画有关.
发布于 2012-02-07 00:34:57
我从来没有明确指出为什么会发生这种情况,但这似乎与我展示第二个窗口而第一个窗口仍然是动画的事实有关。我仍然不明白为什么这会造成问题,但我可以通过等待第一个窗口完全关闭,然后再显示第二个窗口(基本上是连接到第一个窗口的关闭事件)来解决这个问题。
如果“等待第一个窗口关闭”的解决方法不再足够.
发布于 2012-02-01 00:13:21
您是否尝试过向Begin方法添加参数:
_closingStoryBoard.Begin(this);https://stackoverflow.com/questions/9088935
复制相似问题