隐藏元素与DataTriggers

时间:2016-06-28 07:05:23

标签: c# wpf xaml windows-runtime

所以我刚刚加入了一个Windows手机团队,他们倾向于按照以下方式做点什么:

<Image Width="74"
       Height="74"
       Source="ms-appx:///Assets/ImageCatagory/shoot icon.png"
       Visibility="{Binding SomeBoolParameter,
       Converter={StaticResource InvertedBoolToVisibilityConverter}}" />
<Image Width="74"
       Height="74"
       Source="ms-appx:///Assets/ImageCatagory/shoot icon disabled.png"
       Visibility="{Binding SomeBoolParameter,
       Converter={StaticResource BoolToVisibilityConverter}}" />

我已经仔细研究了一下并自己思考:代码重复,向UI加载2个元素(尽管是次要的)加载不必要的内存 - 为什么在任何给定时间只需要一个图像时加载两个图像?

我把它改成了这样:

<Image x:Name="HelperButtonIcon"
       Margin="19 0">

       <i:Interaction.Behaviors>

             <core:DataTriggerBehavior Binding="{Binding SomeBoolParameter}"
                                       ComparisonCondition="Equal"
                                       Value="True">

                   <core:ChangePropertyAction PropertyName="Source"
                                              TargetObject="{Binding ElementName=HelperButtonIcon}"
                                              Value="ms-appx:///Assets/ImageCatagory/helper icon on.png" />

             </core:DataTriggerBehavior>
             <core:DataTriggerBehavior Binding="{Binding SomeBoolParameter}"
                                       ComparisonCondition="Equal"
                                       Value="False">

                   <core:ChangePropertyAction PropertyName="Source"
                                              TargetObject="{Binding ElementName=HelperButtonIcon}"
                                              Value="ms-appx:///Assets/ImageCatagory/helper icon off.png" />

             </core:DataTriggerBehavior>

</i:Interaction.Behaviors>

通过使用DataTriggers,我在任何给定时间只使用1个元素,这对我来说似乎更有效。 然而,代码在很小的问题上得到了一些膨胀,此外,我担心有关加载和切换图像的性能问题。 我还没有找到关于这个问题的最佳实践,尽管我确信它更好,但我还是要确定。 所以问题是:

使用数据触发器是否比可见性开关更好地切换这些相同元素的属性?

2 个答案:

答案 0 :(得分:0)

我不使用任何选项,而是在view-model中使用此登录名

public bool SomeBoolParameter
{
    get { /* ... */ }
    set
    {
        //...
        OnPropertyChanged("SomeBoolParameter");
        OnPropertyChanged("ImageUrl");
    }
}

public string ImageUrl
{
    get
    {
        return SomeBoolParameter ? "..." : "...";
    }
}
<Image Source="{Binging ImageUrl}" />

另外,如果您不做任何花哨的事情,为什么不使用内置的DataTriggers?如果我必须在你的两个选项之间做出选择,它会更喜欢DataTrigger选项,它在逻辑上更清晰。我不认为你应该过多地担心记忆,除非它真的成为一个问题。

答案 1 :(得分:0)

这个话题很有争议。就个人而言,我认为最初的实施更好。我的理由如下:

  1. 现代RAM非常能够存储数百万个缩略图。
  2. 如果您不断更改SomeBoolProperty值,您将从硬盘执行多次读取操作。磁盘IO相对较慢。每次Image的源更改时,图像都会出现在RAM中,垃圾收集器需要更加努力。
  3. 当其他人将来接管您的项目时,您正在让其他人更难理解您的代码。
  4. 当然,如果场景预装了1000张图片,等待转换器告诉他们哪一个应该可见,那么你的解决方案是完全合理的。