在WinRT 8.1中暂停UI

时间:2015-02-24 11:57:30

标签: windows-runtime winrt-xaml windows-8.1

我无法为我的生活获得以下功能:

  1. 用户点按项目
  2. 通过更改图像的可见性属性,项目图像变得可见
  3. 经过短时间后,通过更改,图像再次变为不可见(没有用户输入) 能见度属性
  4. 或者更简单:

    1. 进行可见的UI更改
    2. 暂停,以便用户可以看到用户界面更改
    3. 反向步骤1的用户界面更改
    4. 步骤2发生在步骤1和3之前,无论代码在何处,因为UI在逻辑完成之前不会更新(我假设)。

      我通过使用INotifyPropertyChanged进行数据绑定来设置图像的可见性。除非我试图引入暂停,否则所有工作都按预期工作。

      我试图用这个简单的方法暂停:

      private void Pause()
          {
              new System.Threading.ManualResetEvent(false).WaitOne(1000);
          }
      

      它确实暂停,但UI更改等到暂停之后,即使在调用暂停之前发生对绑定数据的更改,而另一个更改之后也是如此。

      我尝试过使用调度程序,但它没有改变任何东西,我也不太了解它:

      await dispatcher.RunAsync(CoreDispatcherPriority.High, () =>
                  {
                      clickedCard.IsFaceDown = false; // makes the image visible via data binding
      
                  }
      
                  );
      Pause();
      

      我认为我需要对线程做一些事情,但我是在圈子里。 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

你绝不应该在你的应用的UI线程中做这样的事情:

new System.Threading.ManualResetEvent(false).WaitOne(1000);

有多种原因没有这样做,但在您的特定情况下,问题是XAML仅在事件处理程序完成后重新绘制。所以基本上会发生这种情况:

  1. 该项目为invisible
  2. 您的事件处理程序名为
  3. 您将其设置为visible,但用户界面尚未刷新
  4. 你冻结线程一秒
  5. 您再次将其设为invisible
  6. 事件处理程序完成
  7. 现在 UI根据当前值(invisible)更新
  8. 我建议你看看建立一个Storyboard来做这件事 - Blend可以提供帮助。 See here