所以我刚刚加入了一个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个元素,这对我来说似乎更有效。 然而,代码在很小的问题上得到了一些膨胀,此外,我担心有关加载和切换图像的性能问题。 我还没有找到关于这个问题的最佳实践,尽管我确信它更好,但我还是要确定。 所以问题是:
使用数据触发器是否比可见性开关更好地切换这些相同元素的属性?
答案 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)
这个话题很有争议。就个人而言,我认为最初的实施更好。我的理由如下:
SomeBoolProperty
值,您将从硬盘执行多次读取操作。磁盘IO相对较慢。每次Image
的源更改时,图像都会出现在RAM中,垃圾收集器需要更加努力。当然,如果场景预装了1000张图片,等待转换器告诉他们哪一个应该可见,那么你的解决方案是完全合理的。