【问题标题】:How can I prevent flicker in Silverlight views?如何防止 Silverlight 视图中的闪烁?
【发布时间】:2011-01-26 18:17:02
【问题描述】:

我的 Silverlight UI 中有一个相当常见的情况,其中各种元素的可见性绑定到 ViewModel 上的某些属性。例如,我可能有这样的控件:

<myapp:WarningView Visibility="{Binding IsInWarningState}" />

如果警告状态为真,我们想显示控件,如果不是,我们不显示。问题是我有很多情况页面呈现并显示所有内容,包括WarningView 控件,然后一秒钟后隐藏视图,这看起来非常笨拙。

我认为正在发生的事情是 View 加载并对服务器进行异步调用以获取数据,但在此之前,没有 DataContext,因此 WarningView 没有任何东西可以绑定,并且使用默认值和默认值是显示控件。

视图实例化自己的视图模型似乎是最干净的,或者至少我现在正在这样做。而且由于调用是异步的,所以当您想要显示某些内容但您还没有要显示的真实数据时,总会有一些时间间隔。我可以想象制作一个具有更好默认值的模拟 ViewModel,但这似乎需要在整个项目范围内完成很多工作。

那么解决这个问题的最佳方法是什么?

【问题讨论】:

  • IsInWarningState 在您的 VM 中是否默认为 true 或 false?
  • False,这就是控件应该隐藏的原因,并且它在VM加载后隐藏,但在此之前它是可见的,这就是导致闪烁的原因。跨度>
  • 为什么要等待 VM 上的异步调用完成?您能否为 IsInWarningState 属性提供一些代码。你是如何将 ViewModel 附加到 View 的?

标签: silverlight mvvm


【解决方案1】:

好吧,在我放弃这一点很久之后,我自己偶然发现了答案:在绑定中,你可以指定一个 FallbackValue 和/或 TargetNullValue,它们指定一个值,当你绑定的东西不能时使用获得或为空。我的问题是 View 加载并创建 ViewModel,并且在 View 可见和绑定完成之间的瞬间,控件可见,然后绑定折叠它们,这会导致闪烁。通过设置 Fallback 值,我可以确保控件已折叠,然后仅在绑定时打开,然后它们保持打开状态。无闪烁。

【讨论】:

  • +1 非常感谢!我觉得我多年来一直在寻找这个! FallbackValue 成功了。要是我早点知道就好了。为什么我是唯一对此投赞成票的人?
  • 不客气。我也以为这是人们会遇到的普遍情况,但我想不是,因为这个问题没有太多的观点,也没有人回答它。所以也许没有其他人遇到这个问题。难以置信,但它确实存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
  • 2011-01-30
  • 2014-01-06
  • 1970-01-01
  • 2013-08-04
  • 2010-11-28
  • 1970-01-01
相关资源
最近更新 更多