首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Storyboard.Begin()偶尔被阻塞或延迟

问Storyboard.Begin()偶尔被阻塞或延迟
EN

Stack Overflow用户
提问于 2012-02-01 00:05:18
回答 2查看 711关注 0票数 0

当消息窗口关闭时,我们的应用程序使用动画淡出消息窗口。为此,我们重写OnClosing,如果我们还没有完成我们的动画,我们取消关闭并启动动画。当动画完成后,我们关闭窗口。基于我在网上看到的,这似乎是一个相当普遍的模式,因为关闭和关闭都不是可路由的事件。

问题是,我们偶尔会看到一个窗口被“卡住”--动画似乎不会发生,所以“已完成”的标志永远不会被设置,而窗口只是坐在那里,取消任何关闭事件。有时候,动画最终会启动,窗口也会关闭,但其他时候,它似乎永远被卡住了(尽管很明显,您无法判断sure...halting问题和所有这些……)。

有没有人想过为什么即使在调用Begin()之后,故事板也不会被启动呢?如果不能深入研究Storyboard的代码/数据结构,感觉就像是在等待什么事情发生才真正开始,而这从来没有发生过。

以下是我目前排除的一些可能性:

  • 不正确的线程处理(所有窗口、动画、故事板等都是在GUI线程上创建/处理/访问)
  • GUI线程被阻塞(单击X仍然触发关闭事件,GUI线程响应其他窗口、系统托盘等中的事件)
  • GUI线程繁忙(我们只在GUI线程上做UI工作,通常只有一个窗口打开,最多一次运行“关闭”动画)

话虽如此,以下是一些可能有所贡献的东西:

correctly.

  • We
  • Windows可以相互关闭(在某些情况下,如果已经打开,新窗口将关闭现有的)
  • 我们还有一个通过XAML绑定到加载事件的“淡入”动画,但这似乎完成了最近删除了我们的“主”UI窗口,因此应用程序的主窗口现在是一个虚拟隐藏窗口。

我最强烈地怀疑最后一项,因为它是最近添加的,而且在更改之前从未报告/注意到这种行为(虽然我不能确切地说,在更改之前从未发生过这种行为)。但其他与GUI/窗口相关的事件仍能正常工作,淡出动画逻辑大部分时间都能工作。

最后,下面是我们完成关闭动画的代码的主要内容:

代码语言:javascript
复制
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;
        }
    }
}

编辑:每当我们打开两个窗口时,问题似乎就会弹出,并且在显示第二个窗口之前关闭第一个窗口。实质上:

代码语言:javascript
复制
window1.Show()
window1.Close()
window2.Show()

此时,如果我们试图关闭window2,它将取消上面代码中的关闭,但是动画不会开始(因此出现了问题)。如果我们稍后调用window2.Close()后面紧跟着window3.Show() (即显示第三个窗口),那么window2的动画就完成了,窗口关闭了--但是window3却陷入了相同的状态。因此,一旦我们处于这种状态,这种行为几乎就会从一个窗口传递到另一个窗口。

编辑:我排除了另一种可能性--我想知道第二个窗口的“淡入”故事板是否与第一个窗口的“淡出”故事板有某种冲突,并以某种方式影响了第二个窗口的淡出。但是即使在移除淡入的故事板之后,问题也会发生。此外,如果我用半秒的调度定时器替换淡出的故事板(即只是延迟关闭,没有动画),那么问题就完全解决了。只是检查一下是不是和动画有关.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-07 00:34:57

我从来没有明确指出为什么会发生这种情况,但这似乎与我展示第二个窗口而第一个窗口仍然是动画的事实有关。我仍然不明白为什么这会造成问题,但我可以通过等待第一个窗口完全关闭,然后再显示第二个窗口(基本上是连接到第一个窗口的关闭事件)来解决这个问题。

如果“等待第一个窗口关闭”的解决方法不再足够.

票数 0
EN

Stack Overflow用户

发布于 2012-02-01 00:13:21

您是否尝试过向Begin方法添加参数:

代码语言:javascript
复制
_closingStoryBoard.Begin(this);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9088935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档