65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2010年9月21日

Ms-PL

1分钟阅读

viewsIcon

19146

从 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。

© . All rights reserved.