代码之家  ›  专栏  ›  技术社区  ›  Jeff Yates

Silverlight中最大的Gotchas是什么?[关闭]

  •  19
  • Jeff Yates  · 技术社区  · 16 年前

    我最近一直在Silverlight工作,我慢慢地发现,尽管开发起来很简单,但还是有一两个令人讨厌的gotchas潜伏在阴影中。

    考虑到其中一些对我来说是多么的困难,我认为把它们列在这里可能会很有用,这样其他人就可以从中受益。我相信我遇到的那些和其他人的经历相比毫无意义,我想尽量避免任何其他令人讨厌或耗时的意外。

    那么,你有什么?

    更新
    我已将此更新为包含一般的Silverlight。因此,请在响应时提供gotcha相关的版本或列表版本。对于所有没有版本的用户,请假定Silverlight2.0是原始问题中的情况。

    17 回复  |  直到 14 年前
        1
  •  13
  •   Community CDub    8 年前

    我经历过的两件事是:

    跨域策略文件

    要使Silverlight与托管在其他域上的Web服务一起工作,服务器需要 a cross domain policy file . 这可以采用两种格式:

    • 客户端访问策略.xml
    • 跨域访问

    我不能让前者正常工作,但后者正常工作(flash使用第二个,而我相信第一个是特定于ASP的,尽管我不能让它在ASP.NET 2.0服务器下工作,所以它可能是3.5特定的)。

    组合框下拉列表调整大小

    Silverlight2.0组合框控件首次显示时只调整下拉区域一次大小。因此,它的大小是以列表中的初始项目为基础的。这意味着即使列表增加到200,2个项目也会给你一个2个项目的高下拉列表。唯一的解决方法似乎是在每次项更改时用一个全新的控件替换组合。

    请注意,将height属性或maxheight属性设置为一个值,该值将导致在下拉列表的初始显示中出现列表外的项目,这将导致没有垂直滚动条,因此无法访问列表中的项目。我找到的唯一解决方案是使用MinHeight属性,使其至少具有适合所有用途的合适高度,如果项目超过最小高度,就让它更大。

    此外,当您调整浏览器窗口的大小时,无论是否使用minheight,然后下拉组合列表或在可见时调整大小,这都会不可逆转地减小下拉列表的大小。

    更新

    Here is a really nice solution to the combo problem 多亏了 markti .

        2
  •  8
  •   Community CDub    8 年前

    组合框怪异

    有一件事 Jeff Yates mentioned in his reply 这是组合词的怪异之处——我亲自见过,也见过另一个非常非常令人恼火的问题。如果您试图从按钮的Click事件的事件处理程序中更改组合框中的项目,您将收到一条神秘的错误消息,我目前无法想到。我的解决方案是和Jeff的解决方案一样,删除组合框,构建一个新的组合框,用更改的项集填充该组合框,然后将其添加回包含该组合框的面板。

    没有elementname绑定

    Silverlight没有类似于WPF的elementName绑定功能。 This post 有一个很好的解决方法,对我来说非常有效。

    不支持鼠标滚轮事件

    本机不支持捕获鼠标滚轮事件。 This post 提供使用浏览器事件的解决方案。

    在UserControls上没有卸载的事件

    有一个已加载的事件,但没有卸载-如果您想从屏幕上删除一个控件并运行一些卸载逻辑,您需要以自己的方式来执行此操作。我有一个不可下载的接口,我从中派生出我的控件,它需要运行卸载逻辑,并在合适的时间手动调用该逻辑上的方法。


    最后, this post 与WPF相比,它有一些关于Silverlight缺少什么的好信息。

        3
  •  7
  •   Jeff Yates    14 年前

    我错过了一个双击事件。我很惊讶它不在里面,一直在寻找智能感知列表:通过在上面创建一个黑客来解决它,但这不是一个解决方案。

        4
  •  6
  •   Community CDub    8 年前

    我发现调试支持非常脆弱。它曾经为我工作过一次,但从那以后,无论我做什么,都没有。我认为只有通过使用Silverlight ASP支持的ASP.NET 3.5站点进行调试时,它才能正常工作。

    解决了的

    问题在于使用谷歌Chrome。因为Google Chrome在自己的进程中托管Silverlight,所以调试器找不到它。如果您使用IE7进行调试,它会很好地附加,但是如果您使用chrome进行调试,您必须手动附加到chrome下的适当的Silverlight任务,然后它才能工作。

    多亏了 mattmanser for the clue 关于问题可能是什么。

        5
  •  4
  •   tsimon    16 年前

    最近让我想到的一个问题是没有LayoutTransform属性(尽管有一个renderTransform属性)。因此,不能应用转换并使相邻元素遵守控件的“新空间要求”,这将导致它与其他元素重叠或具有空白。

    这对我来说是个问题,因为我希望滚动查看器中的可滚动区域随转换而改变。我可以绕过它,但是如果你试图旋转或者做另一个变换,这个过程会更加困难。

        6
  •  4
  •   Graeme Bradbury    16 年前

    使用IE6和承载Silverlight应用程序的网站已启用压缩(HTTP 1.1头文件)

    每当您调用一个Web服务时,它都会失败,即使fiddler显示正在发送的请求和成功到达的响应。

        7
  •  4
  •   Glenn Slaven    16 年前

    Web请求上没有可用的凭据

    这个 Credentials 属性在上不可用 WebClient HttpWebRequest . 您需要通过 proxy service that will do the credentials .

        8
  •  4
  •   Jeff Yates    16 年前

    httpwebrestone只能有两个状态代码中的一个

    • 200行
    • 404未找到

    这意味着所有其他错误都被映射到404,这非常烦人。我不知道重定向是如何工作的(我希望它们被自动跟踪…)

    http://msdn.microsoft.com/en-us/library/system.net.httpstatuscode(VS.95).aspx

        9
  •  4
  •   Simon_Weaver    15 年前

    事实上,在短时间内有这么多不同的版本。

    -令人沮丧的事情会很快得到解决。例如,鼠标滚轮,右键单击-在Silverlight4中固定。

    坏的 -如果你是新来的,你就不知道文件中的“黑客”是否仍然是必要的。我刚开始使用Silverlight4,发现了大量的教程和帮助——但我不知道它们是最新的还是最好的方法。

        10
  •  3
  •   Llyle    16 年前

    不久前,我在Silverlight2.0中做了一个项目,该项目是使用TDD和MVP驱动的。我的服务引用位于单独的程序集中,因此视图不需要知道模型。我知道了 服务引用.clientconfig 需要在视图程序集中的文件!

    如果添加服务引用,则会生成此文件。我们添加了一个WCF Web服务,但我是Silverlight的新手,因此不知道Silverlight应用程序是编译并打包为XAP的。

    如果你 服务引用.clientconfig 文件不在此Xap中,您有问题。

    所以我有两分钱的价值。我在Silverlight论坛上发布了一段时间,似乎我不是唯一一个应用了这种方法的人。

    My Original Post

        11
  •  3
  •   James Ellis-Jones    16 年前

    哦,有很多东西。让我们从3个浏览器开始:

    唯唯诺诺 :Silverlight对象无法缩放以适应浏览器窗口。 解决方法:将此置于标签之间:

    <style type="text/css">
      html, body, form { height: 100% }
    </style>
    

    也要注意,IE会让你的开发人员网站在本地主机和你的应用访问其他域,而其他浏览器不会。

    游猎 :如果使用自定义响应头(这对于在数据服务中进行高效分页很有用),Safari可能会更改头名称破坏应用程序的情况。

    可见性问题

    更改折叠的可见性组件的属性时存在各种各样的问题,通常情况下,它们不会在不可见的情况下注册更改,而必须在使更改可见时再次注册。SL团队似乎没有彻底测试当您使组件不可见和可见时会发生什么。

    如果遇到意外的间歇性参数异常,很可能是因为在按钮的Click事件中有代码,使按钮本身(或其父级)不可见。显然,一些内部代码在click事件之后运行,该事件期望按钮可见。通过在Click事件中创建一个短的(例如100毫秒)DispatcherTimer,并在Tick事件中设置不可见的按钮来解决这个问题。

    DependencyObject/DependencyProperty问题

    如果你习惯了这些在WPF中的工作方式,那么它们在Silverlight中会被彻底破坏。如果数据对象是DependencyObjects,则会出现两个问题。一个是,在sl dependencyproperties中,没有内置的更改通知-如果希望它们更新绑定,则需要使对象实现inotifypropertieschanged。另一种方法是,如果绑定到DependencyObjects集合,将获得非常强大的效果。您需要在控件层次结构的下方使用一个类-我从frameworktemplate继承了这个类。因此,我建议您的数据对象如下所示:

    public class CustomDataObject : FrameworkTemplate, INotifyPropertyChanged
    { ... }
    

    变流器

    没有多值转换器,也没有绑定。我知道这些没有解决办法。

        12
  •  3
  •   Community CDub    8 年前

    OpenFileDialog/独立存储

    为了让应用程序最初使用或增加本地存储,您必须指定需要多少空间,然后Silverlight会提示用户是否要允许更改。一切都很好。但有一个陷阱:如果打开一个文件对话框,在这之后就没有办法获得更多的存储空间。在我的场景中,用户选择了个文件,我对它们进行了处理,然后计算出保存处理过的文件需要多少空间。但由于这个问题,我不得不猜测该文件的最大大小,并在此基础上请求存储。如果文件更大,用户将不得不重新执行整个过程。

    布局系统

    这真是糟透了。在显式设置元素的大小之前,所有大小属性都会得到NaN。您可以钩住每一个调整大小的事件,并在那里得到值,但在大多数情况下,您不能只要求一个高度或宽度,并得到您想要的。

    无布局转换

    提到 above 特拉维斯

        13
  •  2
  •   mattmanser    16 年前

    调试可能很棘手,如果它不起作用,可能是因为您在进程上附加了错误的代码类型。尝试手动附加到进程,并确保已选择“Silverlight代码”而不是“托管代码”。从那时起,它可能会一直工作。

        14
  •  2
  •   Jeff Yates    16 年前

    消息框

    我在和 System.Windows.MessageBox 最近静态类(目前是获得应用程序模式(而不仅仅是UI模式)用户反馈的唯一方法)和我发现了令人恼火的焦点处理,即消息框将焦点返回到浏览器,而不是显示消息框之前具有焦点的Silverlight控件。毫无疑问,这是因为Silverlight插件使用浏览器显示消息框,但它同样令人恼火,并且结合可用于自定义消息框的有限选项,很快我就明显需要其他东西来提供我的用户反馈。

    显示弹出窗口时阻止用户界面访问…

    在搜索互联网之后,很明显我需要使用基于 Popup 本原的所以,我滚动了自己的模态对话框类,在这个过程中发现了另一个问题。

    弹出窗口下面的用户界面仍然处于活动状态,这意味着周围的选项卡可以让您访问您试图隐藏的控件。为了缓解这种情况,我首先尝试通过获取 RootVisual (即页面)和设置 IsEnabled false . 这很有效,直到我在 DataGrid 编辑操作。对话代码工作了两次,再也没有工作过。似乎在编辑期间禁用和启用网格会导致Silverlight中出现某种不可恢复的问题(可能是内存泄漏,因为它最终崩溃)。

    事实证明,要达到我想要的效果,最简单的方法是将焦点设置为弹出对话框中的某个内容,并设置 TabNavigation 属性到 KeyboardNavigationMode.Cycle . 这样,Focus就不会离开对话框,因此底层的UI仍然超出界限,但不会创建前面提到的问题。

        15
  •  1
  •   user100985    16 年前

    不支持模式弹出窗口 解决方案-创建一个扩展整个画布并将不透明度设置为.05的用户控件 如Scottgu的示例Silverlight应用程序所示 http://weblogs.asp.net/scottgu/pages/silverlight-2-end-to-end-tutorial-building-a-digg-search-client.aspx

    不支持数据集 解决方案-使用可以将XML读取到通用列表中以进行数据绑定的LINQ to XML

    不支持母版页 解决方案-创建父XAML页,并使用用户控件创建应用程序的其余部分,以便在它们之间进行切换

    在将Ajax工具包与ASP.NET Silverlight标记一起使用时,会出现命名空间问题。
    解决方案-使用对象标记而不是ASP.NET Silverlight标记。

        16
  •  0
  •   Jeff Yates    16 年前

    Silverlight在调试时吞下了如此多的异常,这让人沮丧。

        17
  •  0
  •   Jeff Yates    16 年前

    控件由资源作为父级…

    在资源中声明控件,然后尝试将其作为父级 Popup 稍后将导致一个异常,说明该控件已具有父级。在这个场景中,没有办法检测父对象是什么,也没有办法删除它(我尝试了很多不同的方法)。解决方法是将控件包装在资源中的弹出窗口中,然后使代码重新使用该弹出窗口,或者通过重新设置控件来放弃该弹出窗口以支持自己的代码。由于控件可以将弹出窗口标识为其父项,因此很容易做到这一点。