【问题标题】:What .Net/WPF features do you miss when working in Silverlight? [closed]在 Silverlight 中工作时,您错过了哪些 .Net/WPF 功能? [关闭]
【发布时间】:2009-03-11 04:51:31
【问题描述】:

我最近开始使用 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 三次。丑得像罪,但如果这是唯一的方法,那就这样吧。

我很想看看更有经验的 Silverlight 开发人员遇到了哪些其他常见问题,以及您为解决这些问题所做的工作。

【问题讨论】:

  • 您现在可以删除 (4),因为它已被添加
  • 您也可以删除 2,因为 Silverlight 4 对以下内容具有原生鼠标滚轮支持:TextBox、ComboBox、Calendar、DatePicker 和 ScrollViewer(DataGrid 和 ListBox 也是如此)。您对 5) ZIndex 绝对确定吗?您绝对可以在输入 Canvas.ZIndex = 123 的网格中使用它。
  • 也许我们应该在每个答案中添加所引用的 Silverlight 版本。这个话题非常有价值,但如果读者看不到正在讨论的版本,它会随着时间的推移很快失去价值。

标签: .net wpf silverlight xaml


【解决方案1】:

我从哪里开始? :)

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

最重要的是,许多方法签名无缘无故地更改了。例如,IIRC,Dispatcher.Invoke 的重载是不同的,而不是 SL 只是忽略它还不能处理的参数。或者作为另一个例子,WPF 中的 ObservableCollection 可以引发 Add、Remove、Replace 和 Move 事件——在 SL 中它只是前三个。

由于我编写的代码可以在这两个平台上运行,因此代码最终会在策略模式和#ifdefs 中乱七八糟。感觉又像 C++ 了:-)

【讨论】:

  • 非常好...我希望得到这样的列表,所以当它根本不受支持时,我不会浪费时间思考我做错了什么。我没有意识到 RelativeSource 不受支持,我绞尽脑汁想弄清楚我做错了什么。
  • 仅作记录,其中大约 1/3 已在 SL3 中解决。
【解决方案2】:

除了Paul Stovell的优秀名单:

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

【讨论】:

  • 是的......刚刚遇到了对自定义标记扩展的需求,并意识到它无法完成。 =/
【解决方案3】:

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

此外,缺少的类如 StringDictionary 和 ApplicationException,您已经习惯然后发现不存在了,这很痛苦。通常可以找到替代品或解决方法,但我个人更希望 Silverlight 下载从 5MB 到 6MB,所以我们不必这样做;-)。

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

【讨论】:

    【解决方案4】:

    作为一名设计师,缺少事件/属性触发器是所以的。

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

    【讨论】:

      【解决方案5】:

      显然评论 felixthehat 的评论需要一定的声誉。

      但我想支持他对事件/属性触发器的呼吁……WPF 中的触发器框架允许我作为交互设计师完成非常强大的事情,而无需深入研究代码。我想念它。

      【讨论】:

        【解决方案6】:

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

        1. Enum 类不同...不能在 Silverlight 中执行此操作(可以在 WPF 中)绑定到 Enum:

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

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

        WPF:

          protected Brush _CurrentHoleColor = Brushes.Red;
        

        银光:

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

        3 .还没有解决这个问题,但是我用来检查鼠标点击位置的这个 WPF 代码有些不同:

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

        4 .我认为用于创建新线程的重载略有不同

        this.Dispatcher.BeginInvoke(....)
        

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

            不支持 3D。

            【讨论】:

              【解决方案9】:

              Silverlight 的不可变样式和缺乏字典合并也是一大问题 - 如果您正在编写控件,这两个会给您带来很多麻烦 - 更不用说难以管理的大 generic.xaml 文件了。

              【讨论】:

                【解决方案10】:

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

                【讨论】:

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

                  我最大的烦恼:

                  • 命名空间的老鼠窝

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-10-12
                    • 1970-01-01
                    • 2015-09-06
                    • 1970-01-01
                    • 2021-09-08
                    • 2010-10-08
                    相关资源
                    最近更新 更多