在使用Silverlight时,你会错过哪些.Net/WPF功能?

29
我最近开始使用Silverlight,立即注意到Silverlight BCL和完整的.Net和WPF之间的差异。我发现其他开发人员在网上发布了一些很好的解决方案,但有些更加复杂。你惊讶/失望地发现Silverlight类库缺少哪些功能/类,你是如何解决这些问题的?
我的一些问题是:
  1. 没有事件触发的动画 - 我创建了一个帮助类,其中包含用于将我使用过的每种类型的动画附加到共享库中的故事板的静态方法,并且在应用程序级别上,我创建了具有静态方法的类,以将它们全部放在一起,就像在WPF中使用XAML时一样。到目前为止,这对于保持我的动画有组织并将逻辑从我的事件处理程序中删除是一个很好的解决方案。
  2. ScrollViewer不支持鼠标滚轮 - Adam Cooper创建了一个优秀的类库,添加了这个功能,只需要最少量的代码即可在任何Silverlight项目中实现。他的网站目前似乎无法访问,因此这里是Tim Heuer的博客链接,解释并链接到它(所以当他的网站恢复在线时,它将可用)。在Silverlight中为ScrollViewer添加鼠标滚轮支持
  3. SortedDictionary<T, K>缺失。 我发现这篇文章包含一个实现,但我自己没有使用它。
  4. ResourceDictionary.MergedDictionaries不可用 - 再次...找到了一个实现这个功能并发布源代码的人,但它似乎有点复杂。我可能会稍微研究一下,但还没有这样做。在Silverlight中合并字典
  5. ZIndex附加属性仅适用于Canvas对象。 我在SO上发布了这个问题,有人建议将我的容器包装在一个集合中,如果需要的话。这感觉有点粗糙,但你必须做你必须做的事情。我的容器嵌套了三层,所以我可能需要将它们全部包裹在Canvas对象中,并为每个事件设置Canvas.ZIndex三次。丑陋如罪,但如果这是唯一的方法,那就这样吧。

我很感兴趣了解更有经验的Silverlight开发人员遇到的其他常见问题以及你们采取的解决方法。


你现在可以删除(4),因为它已经被添加了。 - Chris S
1
您也可以删除2,因为Silverlight 4原生支持以下控件的鼠标滚轮:TextBox、ComboBox、Calendar、DatePicker和ScrollViewer(所以DataGrid和ListBox也是如此)。而且您对5) ZIndex非常确定吗?您绝对可以在网格中使用它,只需键入Canvas.ZIndex = 123即可。 - texmex5
2
也许我们应该在每个答案中添加所涉及的Silverlight版本。这个话题非常有价值,但如果读者看不到所讨论的版本,它很快就会失去其价值。 - Emond
11个回答

35

我该从哪里开始呢? :)

  • 没有 MultiBinding
  • 没有 ElementName= binding
  • TemplateBinding 只能引用直接的属性,而不能引用附加的依赖属性
  • 没有 RelativeSource 绑定
  • 不能绑定到子属性 - 例如,{Binding Path=Foo.Bar[0].Baz}
  • 无法订阅任意依赖属性的 更改事件 - 类的作者必须明确地定义一个事件(在大多数情况下,SL 控件中只有一两个属性实际上可以这样做)
  • 可视状态管理器 要求控件作者在编写控件时知道所有可样式化的状态,这完全破坏了 WPF 推广的“通过样式/模板扩展而不是继承”的故事
  • 没有 Adorners
  • 没有导航
  • 没有依赖属性继承
  • 对于外部 ResourceDictionaries/merged dictionaries 的支持不佳
  • 验证故事很烂(在 WPF 中仅略好)
  • 打印
  • <Setter .. Value="{Binding ...}" /> 不被支持

除此之外,很多方法签名也无缘无故地改变了。例如,我记得 Dispatcher.Invoke 的重载是不同的,在 SL 中它忽略它尚不能处理的参数。或者另一个例子,ObservableCollection 在 WPF 中可以引发 Add、Remove、Replace 和 Move 事件 - 在 SL 中只有前三个。

由于我编写的代码适用于两个平台,所以这些代码最终充斥着策略模式和 #ifdefs。感觉就像再次写 C++ 一样 :-)


太棒了...我希望能得到这样的列表,这样我就不会浪费时间以为我做错了什么,而实际上它并不支持。我没有意识到RelativeSource不被支持,我一直在努力想弄清楚我的错误在哪里。 - Rich
5
记录一下,其中约有1/3在SL3中得到了解决。 - James Cadd

3

除了Paul Stovell精彩的列表外:

  • 没有自定义标记扩展。
  • 没有x:Type标记扩展。
  • 没有LayoutTransform(虽然有解决办法)。
  • 没有DependencyProperties的方便元数据(必须手动定义测量/排列/呈现失效、属性更改等)。
  • 没有轻量级的DrawingDrawingContext类(必须使用Shape元素)。
  • 没有命令。

是的...我刚刚遇到了需要自定义标记扩展的情况,并意识到这是不可能完成的。 =/ - Rich

2
以下是我将 WPF 应用程序转换为 Silverlight 时遇到的一些问题:
  1. 枚举类不同...在 Silverlight 中无法执行以下操作(但在 WPF 中可以)以绑定到枚举:

    HoleType1.ItemsSource = Enum.GetValues(typeof(Hole.HoleTypes));

  2. 画笔颜色的工作方式不同...

WPF:

  protected Brush _CurrentHoleColor = Brushes.Red;

Silverlight:

  protected Brush _CurrentHoleColor = new SolidColorBrush(Colors.Red);

3. 我还没有弄清楚这个问题,但是有些不同的地方在我用来检查鼠标点击位置的WPF代码中出现了:

System.Windows.Media.VisualTreeHelper.HitTest(canvas1, p);

4. 我认为在使用重载来创建新线程时,有些细微的差别。

this.Dispatcher.BeginInvoke(....)

2
没有套接字或UDP支持可能是我遇到的最大痛点,其次是缺少加密类。
此外,像StringDictionary和ApplicationException这样的缺失类会让你感到困扰。通常可以找到替代品或解决方法,但个人而言,我宁愿Silverlight下载从5MB增加到6MB,这样就不必这么麻烦了 ;-)
我在博客上看到了一个非常方便的技巧,允许我重用我的普通.Net程序集,并将现有项目作为链接添加。现在,在许多情况下,我有两个项目文件使用相同的类文件,一个针对.Net 3.5,另一个针对Silverlight运行时。我非常感激我发现了这个技巧,因为我已经开始为.Net 3.5和Silverlight创建不同的代码库了!

2
作为一名设计师,缺乏事件/属性触发器会让我感到非常无力。我不是C#/oop专家,因此当我需要在加载项目或单击按钮或另一个故事板完成后触发一系列故事板时,我必须要求开发人员帮忙。

2

显然,对于 felixthehat 的评论需要一定声望。

但我想支持他对事件/属性触发器的呼吁...WPF中的触发器框架允许我作为一个交互设计师做一些非常强大的事情,而不必深入到代码中去。我很怀念它。


0
  • ScrollViewer 没有更改事件(必须使用绑定黑客)
  • 直到版本4才支持无浏览器兼容的上下文菜单
  • 有限的 DocumentFlow 支持
  • 没有 MD5 支持(但有更现代的哈希算法)
  • WebClient 不允许您进行 HTTP 身份验证请求。

我最大的抱怨:

  • 一堆命名空间

0

透视 3D 很棒,但我迫不及待地想要真正的 3D!


0
我最大的抱怨是缺乏对所有可用的WCF绑定的全面支持。通常只能使用BasicHttpBinding,这意味着Silverlight解决方案并不总是一个有效的选择。

0

不支持3D。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接