【问题标题】:How can I prevent flickering when binding a boolean to the visibility of a control将布尔值绑定到控件的可见性时如何防止闪烁
【发布时间】:2012-06-27 15:03:42
【问题描述】:

我的 ViewModel 中有一个布尔属性,命名为 IsNotSupported,用于在不支持传感器时显示一些警告信息。因此我使用了BooleanToVisibilityConverter,它被添加到资源中:

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

并将其绑定到包含警告的堆栈面板:

<StackPanel x:Name="NotSupportedWarning" Visibility="{Binding IsNotSupported,
                    Converter={StaticResource BooleanToVisibilityConverter}}">

这一切都很好,但是在加载页面时,并且支持传感器,警告仅出现几分之一秒,然后消失。我知道这种闪烁是由于尚未发生绑定而导致的,因此默认为可见。

那种闪烁真是烦人......它应该默认为折叠并且只有在清楚应该显示警告后才可见。此外,这将避免绑定后的第二次布局传递,因此可能会对性能产生积极影响。


我一遍又一遍地遇到这个问题,直到我发现this SO 问题,这是密切相关的,但如果搜索windows phone 而不是silverlight 则找不到。问题和解决方案都可能看起来很简单,但我确实困扰了我很长时间,所以我认为写一个Q&A-style 的问题来帮助面临同样问题的其他人可能是个好主意。支持>

【问题讨论】:

    标签: c# windows-phone-7 xaml data-binding windows-phone


    【解决方案1】:

    看过之后解决方法很简单。您可以使用FallbackValue 控制绑定的默认值(如果绑定尚未发生)。您的堆栈面板 XAML 如下所示:

    <StackPanel x:Name="NotSupportedWarning" Visibility="{Binding IsNotSupported,
                        FallbackValue=Collapsed, 
                        Converter={StaticResource BooleanToVisibilityConverter}}">
    

    这样您就可以消除闪烁,并且如果警告仍然隐藏,则不必在绑定后重新布局。

    【讨论】:

      【解决方案2】:

      您可以直接绑定到 Visibility 类型的属性而不是布尔值,并默认将该属性保持为折叠状态,此外您还可以实现 INotifyPropertyChanged

      【讨论】:

      • +1 为简单起见。但是,您也可以在视图模型中的布尔值上实现INotifyPropertyChanged。有时您希望将布尔属性用于视图中的其他内容,而不仅仅是设置某些控件的可见性。
      猜你喜欢
      • 1970-01-01
      • 2013-01-15
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多