在Silverlight中工作时,您会错过什么.Net / WPF功能?

时间:2009-03-11 04:51:31

标签: .net wpf silverlight xaml

我最近开始使用Silverlight,并立即注意到Silverlight BCL与完整的.Net和WPF之间的区别。对于其中一些人,我发现其他开发人员在网上发布了很好的解决方案,其他人则更复杂。您在Silverlight类库中找不到哪些功能/类令您感到惊讶/失望,您是如何解决它们的?

我的一些人是:

  1. 没有事件触发动画 - 我创建了一个带有静态方法的辅助类,用于将我用过的每种类型的动画附加到共享库中的故事板,在应用程序级别,我创建了带静态的类如果在WPF中工作,我将在XAML中将它们放在一起的方法。到目前为止,这是一个很好的解决方案,可以保持我的动画组织和我的事件处理程序的逻辑。
  2. ScrollViewer不支持鼠标滚轮 - Adam Cooper创建了一个优秀的类库,添加了此功能,只需要在任何Silverlight项目中实现最少的代码。他的网站目前似乎有所下降,所以这里是Tim Heuer博客的链接,解释并链接到它(所以当他的网站重新上线时它将可用)。 Add mouse wheel support to ScrollViewer in Silverlight
  3. SortedDictionary<T, K>缺失。我发现this post包含一个实现,但我最终没有自己使用它。
  4. ResourceDictionary.MergedDictionaries不可用 - 再次发现有人实现了这个并发布了源代码,但它似乎有点复杂。我可能会稍微研究一下,但还没有这样做。 MergedDictionaries in Silverlight
  5. ZIndex附加属性仅在Canvas对象上可用。我在SO上发布了这个问题,有人提出了一个很好的建议,即如果需要的话,将我的容器包装在一个集合中。感觉有点草率,但你必须做你必须做的事情。我的容器嵌套了三层深,所以我可能需要在Canvas对象中将它们全部扭曲,并为每个事件设置Canvas.ZIndex三次。丑陋如罪,但如果这是唯一的方式,那就这样吧。
  6. 我很想知道Silverlight开发人员遇到的其他常见问题以及您为解决这些问题所采取的措施。

11 个答案:

答案 0 :(得分:35)

我从哪里开始? :)

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

除此之外,许多方法签名都没有任何改变。例如,IIRC,Dispatcher.Invoke的重载是不同的,而不是SL只是忽略它无法处理的参数。或者作为另一个例子,WPF中的ObservableCollection可以引发添加,删除,替换和移动事件 - 在SL中它只是前三个。

由于我编写的代码可以在两个平台上运行,因此代码最终会出现在策略模式和#ifdefs中。感觉像C ++一样: - )

答案 1 :(得分:3)

除了Paul Stovell优秀列表外:

  • 没有自定义标记扩展名。
  • 没有x:Type标记扩展名。
  • LayoutTransform(虽然有workarounds)。
  • DependencyProperties没有便利元数据(必须手动定义测量/排列/渲染失效,属性更改等)。
  • 没有轻量级DrawingDrawingContext类(必须使用Shape元素)。
  • 没有命令。

答案 2 :(得分:2)

对于我来说,没有套接字或UDP支持可能是最大的痛苦,其次是缺少加密类。

此外,你习惯但后来发现的像StringDictionary和ApplicationException这样的遗漏分类并不痛苦。一般来说,有可能找到一个替代品或解决方法,但我个人认为Silverlight下载从5MB到6MB,所以我们没有; - )。

我在博客上看到的一个非常方便的技巧是允许我重用我的普通.Net程序集,将现有项添加为链接。在许多情况下,现在我有两个项目文件使用相同的类文件,其中一个目标是.Net 3.5,另一个是Silverlight运行时。我非常感谢我找到了这个技巧,因为我已经开始为.Net 3.5和Silverlight创建不同的代码库了!

答案 3 :(得分:2)

作为设计师,缺少事件/属性触发器是所以剥夺功能。

我不是C#/ oop家伙所以当我必须在项目加载或点击按钮时或在另一个故事板完成后触发一系列故事板时,我必须调用开发人员:(

答案 4 :(得分:2)

显然在评论felix时,评论需要一定的声誉。

但是我想继续他对Event / Property触发器的调用...... WPF中的Triggers框架允许我作为交互设计师做一些非常强大的事情,而不必深入研究代码。我想念它。

答案 5 :(得分:2)

以下是我将WPF应用转换为Silverlight时遇到的一些事情:

  1. 枚举类不同......无法在Silverlight(可以在WPF中)中绑定到枚举:

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

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

  3. 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(....)
    

答案 6 :(得分:0)

我最大的抱怨是缺乏对所有可用WCF绑定的完全支持。只能通常能够使用BasicHttpBinding意味着解决问题的银色解决方案不是一个有效的选择。

答案 7 :(得分:0)

没有3D支持。

答案 8 :(得分:0)

Silverlight的不可变样式和缺少字典合并也很重要 - 如果你正在编写控件,这两个会给你带来很多麻烦 - 更不用说无法管理的大型generic.xaml文件了。

答案 9 :(得分:0)

透视3D很棒,但我等不及真正的3D!

答案 10 :(得分:0)

  • ScrollViewer没有更改事件(您必须使用绑定hack)
  • 版本4
  • 之前不支持与浏览器无关的上下文菜单
  • 有限DocumentFlow支持
  • 没有MD5支持(但更现代的哈希算法)
  • WebClient不允许您执行HTTP身份验证请求。

我最大的痛苦:

  • 老鼠的名称空间嵌套