从 WPF 移植到 Silverlight:缺失的部分,第一部分





5.00/5 (2投票s)
从 WPF 移植到 Silverlight:缺失的部分,第一部分
最近我一直在将一个 WPF 3.5 应用程序移植到一个 Silverlight 3 Web 应用程序。我遇到了许多 Silverlight 3 相对于 WPF 3.5 的限制。
幸运的是,我在博客圈中找到了许多优秀的解决方案。这些解决方案对我帮助很大,我想记录下来供大家参考。此外,这份列表可能对其他将应用程序从 WPF 移植到 Silverlight 的人有所帮助。
最后说明一点,移植是从 WPF 3.5 到 Silverlight 3 完成的。有些问题可能在 Silverlight 4 中已经解决,或者有不同的解决方案。
没有命令 (Commands)
描述:Silverlight 3 缺乏对命令的适当支持。
虽然 Silverlight 3 确实有 ICommand
的定义,但按钮没有 Command
属性来绑定。
解决方案提供者:Patrick Cauldwell
http://www.cauldwell.net/patrick/blog/MVVMBindingToCommandsInSilverlight.aspx
简而言之
而不是写:
<Button
Content="Say Hello"
Command="{Binding Path=SayHello}"
/>
使用帖子中的代码并编写
<Button
Content="Say Hello"
my:ButtonService.Command="{Binding Path=SayHello}"
/>
没有 ClipToBounds
描述:Silverlight 3 缺乏对 ClipToBounds
的支持。
解决方案提供者:Colin Eberhardt
http://www.scottlogic.co.uk/blog/colin/2009/05/silverlight-cliptobounds-can-i-clip-it-yes-you-can/
简而言之
而不是写:
<Grid
Background="Yellow"
Margin="20,40,-20,20"
ClipToBounds="True"
>
...
</Grid>
使用帖子中的代码并编写
<Grid
Background="Yellow"
Margin="20,40,-20,20"
util:Clip.ToBounds="True"
>
...
</Grid>
没有 DataContextChanged 事件
描述:Silverlight 3 没有 DataContextChanged
事件。
解决方案提供者:Emiel Jongerius
http://www.pochet.net/blog/2010/06/16/silverlight-datacontext-changed-event-and-trigger/
简而言之
而不是写:
MyControl.DataContextChanged += MyControl_DataContextChanged;
使用帖子中的代码并编写
DataContextChangedHelper.AddDataContextChangedHandler(MyControl,
MyControl_DataContextChanged);
没有 DataTrigger
描述:Silverlight 3 没有数据触发器,它使用完全不同的模型,使用 VisualStateManager
。
解决方案提供者:Pete Blois
http://blois.us/blog/2009/04/datatrigger-bindings-on-non.html
简而言之
而不是写:
<DataTrigger Binding="{Binding IsLoaded}" Value="True"> ... DOING STUFF<DataTrigger>
使用帖子中的代码并编写
<i:Interaction.Behaviors>
<id:DataStateSwitchBehavior Binding='{Binding IsLoaded}'>
<id:DataStateSwitchCase Value='True' State='Loaded'/>
</id:DataStateSwitchBehavior>
</i:Interaction.Behaviors>
当然,你应该定义一个执行相同“操作”的状态。
过渡不是立即的,但至少它提供了与数据触发器相同的功能。
待续...
暂时就到这里,
Arik Poznanski。