如何避免Silverlight视图中的闪烁?

3

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

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

如果警告状态为真,我们希望显示控件,否则不显示。问题是,有很多情况下页面会渲染并显示所有内容,包括 WarningView 控件,然后一秒钟后再隐藏视图,这看起来非常笨拙。
我认为发生的事情是 View 加载并进行异步调用以获取数据,但在此之前,没有 DataContext,因此 WarningView 没有绑定的内容,只能使用默认值,并且默认值是显示控件。
似乎最清晰的方法是视图实例化自己的视图模型,或者至少是我现在正在做的。由于调用是异步的,可能始终存在某个时间间隔,您想要显示某些内容,但尚未有真正的数据可供显示。我可以想象制作一个具有更好默认值的模拟 ViewModel,但这似乎需要在整个项目中进行大量工作。
那么,如何解决这个问题呢?

你的虚拟机中IsInWarningState默认为true还是false? - Jason Quinn
错误,这就是为什么控件应该被隐藏的原因,并且一旦虚拟机加载,它被隐藏了,但在此之前它是可见的,这就是导致闪烁的原因。 - Joshua Frank
你为什么要等待VM上的异步调用完成呢?你可以请包含一些关于IsInWarningState属性的代码吗?你是如何将ViewModel附加到View的? - Myles J
1个回答

5

好的,虽然我已经放弃了,但最终我自己找到了答案:在绑定中,您可以指定FallbackValue和/或TargetNullValue,它们指定在无法获取或为空时要使用的值。我的问题是视图加载并创建ViewModel,在视图可见且绑定完成之间的瞬间,控件是可见的,然后绑定会使它们崩溃,这会导致闪烁。通过设置Fallback值,我可以确保控件被折叠,然后仅在绑定时打开,然后它们保持打开状态。没有闪烁。


+1 谢谢!我感觉我已经寻找这个东西好几年了!FallbackValue 真的解决了问题。要是早些知道就好了。为什么只有我一个人点赞呢? - Philip Daubmeier
非常感谢。我也认为这是一个常见的情况,人们可能会遇到这种情况,但我猜可能并不是这样,因为这个问题没有得到很多关注,也没有人回答它。所以也许没有其他人遇到过这个问题。难以置信,但事实就是这样。 - Joshua Frank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接