【问题标题】:Is there a way to insert Silverlight XAML into my page using ASP.NET code-behind?有没有办法使用 ASP.NET 代码隐藏将 Silverlight XAML 插入我的页面?
【发布时间】:2009-06-21 11:29:20
【问题描述】:

所以,我想根据我的 ASP.NET 网页上的一些数据创建一些 Silverlight 图表。这样做的方法,无论是使用Visifire(我现在的东西)还是即将推出的Silverlight charting,似乎是创建一些XAML,或者至少是一些Silverlight对象(like in this Visifire sample),然后将它们填充到页面中不知何故。

奇怪的是,这样做的唯一方法似乎是通过 JavaScript!也就是说,我必须这样做:

用户 -> 点击按钮 -> JavaScript 事件处理程序 -> AJAX 调用以从服务器端方法获取 XAML -> 将 XAML 字符串填充到客户端 HTML(如 this in generallike this for a Visifire-specific method)。

这是非常违反直觉的!我更想要的是能够在MyPage.aspx.cs 内部做这样的事情:

protected void MyButton_Click(object sender, EventArgs e)
{
    this.MyFictionalSilverlightControl.Xaml = this.GenerateXamlFromData();
}

这样会好很多!我很高兴将MyFictionalSilverlightControl 保留在UpdatePanel 中,尽管它效率低下;我只是希望我知道如何制作这样一个虚构的 Silverlight 控件。

有什么想法吗?或者关于如何更好地做到这一点的建议?

【问题讨论】:

    标签: asp.net ajax silverlight xaml


    【解决方案1】:

    我建议采用更 AJAXy 的方法:让 JS 请求 XAML,然后在从服务器返回 XAML 后运行时将该 XAML 插入到控件中(请参阅 HTML 桥)。这样你的控件就可以很好地动画/过渡到新的显示。

    不过,你可以做你想做的事:

    • 在您的更新面板中输入Silverlight server control
    • 编写一个 aspx 页面以生成 XAML(更改 DocType 以使事情变得更简单)
    • 将 Silverlight 服务器控件指向 .ASPX 页面:

      ... asp:Silverlight ID="Xaml1" 运行=“服务器” 来源="~/ClientBin/myXAMLPage.aspx" 最低版本=“2.0.30523” 宽度=“100%” 高度="100%">

    • 每当用户单击您的按钮时,触发 UpdatePanel 执行此操作。

    现在,每当用户单击按钮时,将呈现更新面板(包含 Silverlight 控件),并且该 SL 控件将请求 XAML 文件并呈现它找到的内容。

    请注意,此方法使用 XAML 文件实例化控件。这意味着您将无法在 Silverlight 中使用托管代码。如果您需要托管代码,而不是在源中指定“myXAMLPage.aspx”页面,而是指定您的 .xap 文件,然后使用 initparam 指定“myXAMLPage.aspx”。在您的 Silverlight 应用程序中,下载 xaml 文件(WebClient 或其他),然后使用 XamlReader.Load 加载并显示它。

    hth, 埃里克

    【讨论】:

    • 那是完美。非常感谢。正是我想要的。
    【解决方案2】:

    我建议您下载 ASP.NET Silverlight Server Control。有关此控件的更多信息可以找到here. 通常,您将编译好的 XAM 文件放在 BIN 目录中,然后将 XAML 链接到 asp:Silverlight 控件。他负责其余的事情。此外,可以使用 asp:Silverlight 的输入参数集合将一些参数传递给 Silverlight。这是一种繁琐的方法,但很有效。

    【讨论】:

    • 我看不出这有什么帮助。它仍然需要一个 .xap 文件,该文件由(除其他外)静态 .xaml 和 .xaml.cs 文件组成;这些都不能让我从 myPage.aspx.cs 代码隐藏设置 XAML 内容。
    【解决方案3】:

    我可能错了 - 作为 WPF 开发人员而不是 SilverLight 开发人员来回答这个问题,但是在 WPF 中,您可以在代码中创建控件并将其插入到 XAML 中。

    Label myLabel = new Label(); // Create a new control
    myLabel.Text = "Hello Wirral"; // Change some of its properties
    MyContainingPanel.Children.Add(myLabel); // Add it to an existing container
    

    【讨论】:

    • 我认为,问题在于我没有任何访问权限,例如我的 Page_Load 方法到任何控件,如 MyContainingPanel(或 MyFictionalSilverlightControl)。
    【解决方案4】:

    真正简单的解决方案是也只在 Silverlight 中进行表格/数据展示。然后使用网络服务将数据提供给您的 silverlight 应用程序。

    我确信 MS 完全赞同这一点。

    否则(你要求它;):

    您提供的理想解决方案的问题在于,ASP.Net 的抽象隐藏了数据双重发布的现实,以及在客户端 silverlight 应用程序可以做到的情况下在服务器上构建客户端界面它本身非常好:

    第 1 步 - 将嵌入数据的 html 发送到客户端

    第 2 步 - 初始化客户端应用程序(silverlight 应用程序)

    第 3 步 - 按下按钮调用服务器上的 GenerateXamlFromData

    第 4 步 - 获取与第 1 步相同的数据,然后从中创建一些 Xaml

    第 5 步 - 将其传回浏览器

    第 6 步 - 在 Silverlight 应用程序中调用方法来设置 Xaml

    步骤 3-5 完全是多余的。在客户端上,您已经拥有数据和能够动态创建图表的东西,silverlight 应用程序。

    如果绝对要求表格是html,我的解决方法是:

    使您的数据非 html。使用 XML/XSLTransform、JSON/javascript/JQuery 或任何您喜欢的客户端转换来呈现它。网络服务,随便。关键是你打开你的网页,http 回传数据并动态创建你的 html 表。然后将相同的数据传递给您的 silverlight 应用程序并让它创建图表。

    您的 silverlight 应用程序可以通过简单的对象创建来动态构建图表。如果您真的喜欢用铅笔戳自己的眼睛,您仍然可以动态构建 Xaml 字符串并使用这些字符串来创建图表对象,这是获得 Xaml-Nazi 的 StackOverflow 徽章的简单方法

    对于您的问题还有另一种解决方案,如果您真的想要,您可以将 html 表 dom 传递给 Sivlerlight 应用程序,然后从中提取数据。一般来说,除非你做了一些非常愚蠢的符合 XML 的 html 表,否则只需将其加载到 XDocument 中。

    至于您描述的简单方式,afaik 不可能 atm。也许有一天会,但老实说,它永远不会是一个好的解决方案,它只会成为那些想要将快速而肮脏的应用程序组合在一起的人的解决方案。

    【讨论】:

    • 我对这篇文章感到非常困惑,因为我从未提到过 HTML 表格。我实际上在做的是从远程服务器收集数据——这就是 this.GenerateXamlFromData() 所做的——并希望把它变成一个图表。所以真的就像 1) 向客户端发送 HTML 并带有一个按钮,上面写着“给我一张图表”; 3) 按下按钮; 4) 从远程服务器获取新数据并从中创建 XAML; 5, 6) 和以前一样。
    • 但听起来你说的是我需要一起破解一些荒谬的东西,比如将生成的 XAML AJAXing 到隐藏的文本字段中,然后一些 JavaScript 在 AJAX onreadystatechanged 时将其插入到 Silverlight 控件中(因为显然,JavaScript 是操纵 Silverlight 控件的唯一方法)。不过,您在开头提到的替代方案可能是最好的。即让按钮(实际上是整个登录/调整参数/单击按钮过程的简化)成为 Silverlight XAP 的一部分。
    猜你喜欢
    • 1970-01-01
    • 2019-01-23
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    相关资源
    最近更新 更多