如何在将布尔值绑定到控件的可见性时防止闪烁

6

我在ViewModel中有一个布尔属性,假设它的名称是IsNotSupported,如果某个传感器不受支持,则用于显示一些警告信息。因此,我使用一个BooleanToVisibilityConverter,将其添加到资源中:

<phone:PhoneApplicationPage.Resources>
    <local:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
</phone:PhoneApplicationPage.Resources>

并将其绑定到包含警告的堆栈面板上:
<StackPanel x:Name="NotSupportedWarning" Visibility="{Binding IsNotSupported,
                    Converter={StaticResource BooleanToVisibilityConverter}}">

那很好地解决了问题,但在加载页面时,如果传感器得到支持,警告只会出现一小部分时间,然后消失。我知道这种闪烁是由于绑定尚未发生而默认为可见所致。
这种闪烁非常恼人... 它应该默认为折叠状态,并在确定需要显示警告后才将其设置为可见。此外,这将避免在绑定之后进行第二个布局处理,因此可能对性能产生积极影响。
我一再遇到这个问题,在互联网上找不到任何相关信息,直到我发现与此密切相关的 SO问题,但如果搜索Windows手机而不是Silverlight,则无法找到该问题和答案。虽然这个问题和解决方案似乎很简单,但它确实困扰了我很长一段时间,所以我觉得写一个关于它的Q&A-style问题来帮助其他面临同样问题的人是个好主意。
2个回答

9
解决方案很简单,一旦你看到它。您可以使用控制绑定的默认值(如果尚未绑定)。您的stackpanel XAML应如下所示:
<StackPanel x:Name="NotSupportedWarning" Visibility="{Binding IsNotSupported,
                    FallbackValue=Collapsed, 
                    Converter={StaticResource BooleanToVisibilityConverter}}">

这样做可以消除闪烁,而且如果警告保持隐藏,则不必在绑定后重新布局。

1

你可以直接绑定到一个Visibility类型的属性,而不是布尔类型,并将该属性默认设置为Collapsed,此外你还可以实现INotifyPropertyChanged接口。


+1 简单易懂。然而,在您的视图模型中,您同样可以很好地实现“INotifyPropertyChanged”接口来处理布尔值。有时候,您可能希望在视图中使用布尔属性来完成其他任务,而不仅仅是设置特定控件的可见性。 - Philip Daubmeier

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