在将应用程序从WPF 3.5迁移到Silverlight3的过程中,遇到了一些限制。幸运的是,通过博客圈中众多优秀解决方案的帮助,得以克服这些挑战。以下是一些关键问题的解决方案,这些解决方案不仅对自己有帮助,也可能对其他人在进行类似迁移时有所裨益。需要注意的是,这些转换是从WPF3.5到Silverlight 3进行的,Silverlight 4可能已经解决了一些问题,或者有其他的解决方案。
在Silverlight 3中,没有对命令的适当支持。尽管Silverlight 3定义了ICommand
,但按钮没有与之绑定的Command
属性。解决方案如下:
Patrick Cauldwell提供了一个解决方案,可以通过以下方式实现:
<Button Content="Say Hello" my:ButtonService.Command="{Binding Path=SayHello}" />
而不是:
<Button Content="Say Hello" Command="{Binding Path=SayHello}" />
Silverlight3不支持ClipToBounds
属性。Colin Eberhardt提供了一个解决方案,可以通过以下方式实现:
<Grid Background="Yellow" Margin="20,40,-20,20" util:Clip.ToBounds="True">
...
</Grid>
而不是:
<Grid Background="Yellow" Margin="20,40,-20,20" ClipToBounds="True">
...
</Grid>
Silverlight3没有DataContextChanged
事件。Emiel Jongerius提供了一个解决方案,可以通过以下方式实现:
DataContextChangedHelper.AddDataContextChangedHandler(MyControl, MyControl_DataContextChanged);
而不是:
MyControl.DataContextChanged += MyControl_DataContextChanged;
Silverlight 3没有数据触发器,它使用了一个完全不同的模型,使用VisualStateManager
。Pete Blois提供了一个解决方案,可以通过以下方式实现:
<i:Interaction.Behaviors>
<id:DataStateSwitchBehavior Binding="{Binding IsLoaded}">
<id:DataStateSwitchCase Value="True" State="Loaded" />
</id:DataStateSwitchBehavior>
</i:Interaction.Behaviors>
而不是:
<DataTrigger Binding="{Binding IsLoaded}" Value="True">
... DOING STUFF
</DataTrigger>