locked
請問大大, 製作 Silverlight 1.1 User Control 的問題. RRS feed

  • 問題

  • 請問大大,

    我使用 Code Behind (inline) 的方式, 想要將 Silverlight 的程式作成 User Control,
    可是不知為何, 只要點選有 JavaScript 功能的 Silverlight 按鈕, 就會出現 "此處需要物
    件" 的訊息.
    原本 Silverlight 程式是在 .aspx 中撰寫的, 執行也正常, 但將其複製到 .ascx 後, 就會
    出現上述訊息.

    環境為 Silverlight 1.1 + Visual Basic + VS2008
    1. 測試頁已經佈置了 ScriptManager
    2. .ascx 中已佈置了 ScriptManagerProxy

    Sample 如下:

    Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender

            Dim inLineXamlID As String = "inLineXaml_" & Me.UniqueID
            Dim xamlString As String = ""
            xamlString += vbCrLf & "<script type='text/xaml' id='" & inLineXamlID & "'>"
            xamlString += vbCrLf & "<?xml version='1.0'?>"
            xamlString += vbCrLf & "<Canvas x:Name='Canvas1'"
            xamlString += vbCrLf & "  xmlns='http://schemas.microsoft.com/client/2007'"
            .........
            .........
            .........
            xamlString += vbCrLf & "</script>"

            Me.Page.ClientScript.RegisterStartupScript(GetType(String), "id", xamlString, False)
            Me.Silverlight1.Source = "#" & inLineXamlID

     

            Dim js2 As String = ""
            js2 += vbCrLf + "function LeftButtonDown(sender, e){"

            js2 += vbCrLf + "var ArraySmallPIC = new Array();"
            js2 += vbCrLf + "for (i=1; i<=10; i++){"
            js2 += vbCrLf + "var SmallPIC='SmallPIC' + i ;"
            js2 += vbCrLf + "ArraySmallPICIdea = document.getElementById('Silverlight1').content.findName(SmallPIC);"
            .........
            .........
            .........
            js2 += vbCrLf + "}"

            Me.Page.ClientScript.RegisterStartupScript(GetType(String), "ID2", js2, True)

     

     

     

     

    2008年12月8日 上午 09:47

解答

  • Silverlight 沒有 1.1,只有 2.0...

     

    你的問題可能是出在這行吧:

    Code Snippet

    document.getElementById('Silverlight1').content.findName(SmallPIC);

     

     

    在你把程式移到 User control 時,它的 Client ID 會有變化,所以你可以試著改成:

     

    Code Snippet
    "document.getElementById('" + Me.Silverlight1.ClientID + "').content.findName(SmallPIC);"

     

     

     

    2008年12月8日 上午 09:53
    版主

所有回覆

  • Silverlight 沒有 1.1,只有 2.0...

     

    你的問題可能是出在這行吧:

    Code Snippet

    document.getElementById('Silverlight1').content.findName(SmallPIC);

     

     

    在你把程式移到 User control 時,它的 Client ID 會有變化,所以你可以試著改成:

     

    Code Snippet
    "document.getElementById('" + Me.Silverlight1.ClientID + "').content.findName(SmallPIC);"

     

     

     

    2008年12月8日 上午 09:53
    版主
  • Silverlight1.1扔掉吧,
    Silverlight2 还有Silverlight1.0的Runtime都不支持了,

    Silverlight1.1只是一个被废弃掉的过度产品,介于js与C# Code之间的一个比较混杂的东东

    2008年12月8日 下午 01:52
  • 也不能這麼說啦..在Silverlight 2.0上還是可以開發用javascript處理的東西...

     

    2008年12月9日 上午 12:54
    版主
  • 所謂的1.1版其實就是2.0版的前身

    當初1.0在開發時就同步開發1.1版,

    兩者的差別是1.0的操作語言為JavaScript,所以嚴格來說所謂1.0就是Silverlight的RunTime Kernel部分.

     

    而當初會命名1.1的原因只是因為1.1是由1.0擴充dotNet部分的程式設計架構.

    只不過因為1.1這個版本稱號感覺不出來有太大的改變,所以才直接更動為2.0版這個編號

    故實際上1.1就是2.0.

     

    但不論版本如何

    目前2.0 Runtime如上所說的可以相容於1.0,未來也應該會如此下去.

    所以如果使用JavaScript來操作Silverlight物件未來應該還是會繼續存在,畢竟Silverlight是內建於瀏覽器上,這部分的Object Modal是不會捨棄的,不然跟HTML部分的溝通彈性消失,很多東西無法做到.

     

    但如單就Silverlight本身運作就不應該再用Javascript來操作,應該要完全使用dotNet Language架構來開發才是正確的.

    說實在根本就不應該有1.0這個版本,

    嚴格來說現在的2.0才是真正的Silverlight 1.0.

    如果當初是直接發佈現在的2.0,那市面上的書籍一定都已dotNet方式開發,而JavaScript部分只是其中一個介紹與HTML橋梁

    的章節.
    2008年12月9日 上午 06:12
  • 把 Silverlight 1.0 當成一種 PoC (Proof of Concept) 的 Release 就好了...

    2008年12月9日 上午 06:24
    版主
  • 謝謝大大, 原來 Silverlight control 的 client 用法是如此啊. 感恩!

    2008年12月9日 下午 12:13
  • 謝謝八爪熊大的資訊.

     

    原本想要用 VS 2008 的 Silverlight 1.1 控件(控制項) 來開發 user control, 然後讓 ASP.NET 2.0  的網頁使用 , 故沒有採用 Silverlight 2.0.

     

    於是我在 VS 2008 上開發的 Silverlight inline code, 將其複製到 ASP.NET 2.0 的 .ascx 上, 並修改 Silverlight1 控件 為 Xaml1, 然後 在 Web.config 的 system.web 內加入

    <httpHandlers>
          <remove verb="*" path="*.asmx"/>
          <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
          <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/>
    </httpHandlers>

    <httpModules>
          <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
    </httpModules>

     

    不過要將"Microsoft.Web.Preview.dll" 和"Microsoft.Web.Preview.dll.refresh" 檔案替換為 .NET 2.0 Xaml的版本.

    (1.2.61025.0 -> 1.3.61025.0)

    這樣就可以用了.

     

    如有更好的方式, 再煩請大大們指導兩下.

     

    2008年12月9日 下午 12:31