Silverlight 3与WPF 3.5的转换指南

在将应用程序从WPF 3.5迁移到Silverlight3的过程中,遇到了一些限制。幸运的是,通过博客圈中众多优秀解决方案的帮助,得以克服这些挑战。以下是一些关键问题的解决方案,这些解决方案不仅对自己有帮助,也可能对其他人在进行类似迁移时有所裨益。需要注意的是,这些转换是从WPF3.5到Silverlight 3进行的,Silverlight 4可能已经解决了一些问题,或者有其他的解决方案。

1. 命令支持的缺失

在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}" />

2. ClipToBounds属性的缺失

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>

3. DataContextChanged事件的缺失

Silverlight3没有DataContextChanged事件。Emiel Jongerius提供了一个解决方案,可以通过以下方式实现:

DataContextChangedHelper.AddDataContextChangedHandler(MyControl, MyControl_DataContextChanged);

而不是:

MyControl.DataContextChanged += MyControl_DataContextChanged;

4. DataTrigger的缺失

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>
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485