locked
Silverlight初学者常见问题解答 RRS feed

全部回复

  •  

    1调试WCF相关问题的一般步骤是什么? 

    默认情况下,Silverlight使用浏览器HTTP栈。这种情况下,如果WCF发生了一个错误,它会发送HTTP 404响应码,错误详细信息并不能在Silverlight客户端中被访问到。为了得到异常的详细信息,我们可以使用客户端HTTP栈。 

     

    为此, 请尝试以下步骤:

     

    1. 当应用程序开始时加入如下代码(请注意,这只是出于调试目的)

     

    WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);

    WebRequest.RegisterPrefix("https://", WebRequestCreator.ClientHttp);

     

     

    2. 单击 “Debug”->”Exceptions”。选择 “Common Language Runtime Exceptions”.

     

    3. 单击 “Tools”->”Options”->”Debugging”。 不勾选 “Enable Just My Code (Managed Only)” 来获得更多异常信息

    注意:在执行此步骤之后,在调试中被应用程序正确处理的异常也会一个断点。有时你只想对特定的异常触发断点,例如System.Net.WebException。 为此,请将 “Debug”->”Exceptions”中的树选项展开,并选择你想要触发断点的异常。

     

    4.在服务器端,将includeExceptionDetailInFaults属性设置为“True”.

    这指定了返回至客户端的SOAP 错误(fault)的详细信息中是否要包括托管异常的信息。请参考如下web.config的设置部分。

     

    <system.serviceModel>

          <behaviors>

             <serviceBehaviors>

                 <behavior name="SimpleWCFBehavior">

                     <serviceMetadata httpGetEnabled="true" />

                     <serviceDebug includeExceptionDetailInFaults="True" />

                 </behavior>

             </serviceBehaviors>

          </behaviors>

           <services>

             <service behaviorConfiguration="SimpleWCFBehavior" name="SimpleWCF">

                 <endpoint address="" binding="basicHttpBinding" contract="ISimpleWCF">

                     <identity>

                         <dns value="localhost" />

                     </identity>

                </endpoint>

                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />

             </service>

          </services>

     </system.serviceModel>

     

    你可以参考如下文档来获得更多详细信息:

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

    http://msdn.microsoft.com/en-us/library/system.servicemodel.description.servicedebugbehavior.includeexceptiondetailinfaults.aspx

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

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

     

    2010年6月14日 1:11
    版主
  •  

    2.如何使得Silverlight和HTML元素之间进行交互?

     2.1.  如何从JavaScript调用中可脚本化的方法?

    1.      为目标方法增加ScriptableMember

    [ScriptableType]

    public class JavasSriptClass

    {

         [ScriptableMember]

         public string CallScriptableMethod(string parametername)

         {

             return "The Parameter Name is " + parametername;

          }

    }             

     

    2.       将托管对象注册为可被JavaScript代码以脚本化方法访问

              HtmlPage.RegisterScriptableObject("basic", new JavaScriptClass());

     

     

    3.        在HTML页面如下调用该方法:

    function callScriptableFun(parameter)

    {

    var control = document.getElementById("SilverlightControl");

    var res = control.content.basic.CallScriptableMethod(parameter);

    }

     

           注意:SilverlightControl 是你的 Silverlight控件的  ID。

                                   

                参考网址

    http://msdn.microsoft.com/en-us/library/system.windows.browser.htmlpage.registerscriptableobject(VS.95).aspx

     

     

        2.2. 如何从代码后置调用客户端JavaScript函数?

    using System.Windows.Browser;

    HtmlPage.Window.CreateInstance("Your Function Name", new string[] { "parameter1","parameter2"  });        

         

     

         2.3. 如何从代码后置访问HTML元素?

    using System.Windows.Browser;

    HtmlDocument doc = HtmlPage.Document;

    doc.GetElementById("target control’s ID").SetProperty("innerHTML", "<b>hello world</b>");

     

     

    3.如何在Visual Studio中调试带有Silverlight功能的网站中的JavaScript代码?

    要做到这一点,请右击你的Web项目,选择 “Properties”。在属性窗口,导航至 Web 标签,不勾选“Silverlight”. 见下图.

     

     


    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Windows Azure Platform China Blog: http://blogs.msdn.com/azchina/default.aspx
    2010年6月14日 1:14
    版主
  • 4.如何处理 Out-Of-Browser 相关问题?

    4.1. 如何检测应用程序是否工作在OOB( Out-Of-Browser)模式?

    在一些可能的场景下,你会依据应用程序的工作模式添加不同 的行为。为此,有2种方法供你选择。

         方法 1: 

                    Application.Current.IsRunningOutOfBrowser

         方法 2: 

                    HtmlPage.IsEnabled

     

     

    4.2. 如何检测OOB更新?

           我们可以在程序开始时调用CheckAndDownloadUpdateAsync()方法,并处理 UpdateCompleted 事件。

    private void Application_Startup(object sender, StartupEventArgs e)

    {

             this.CheckAndDownloadUpdateAsync();

             this.RootVisual = new MainPage();

    }

                   

    public App()

    {

                this.Startup += this.Application_Startup;

                this.Exit += this.Application_Exit;

                this.UnhandledException += this.Application_UnhandledException;

                this.CheckAndDownloadUpdateCompleted += newCheckAndDownloadUpdateCompletedEventHandler(App_CheckAndDownloadUpdateCompleted);

                InitializeComponent();

               

    }

     

    void App_CheckAndDownloadUpdateCompleted(object sender, CheckAndDownloadUpdateCompletedEventArgs e)

     {

                if (e.UpdateAvailable) {

                    MessageBox.Show("There are new updates downloaded. Please restart!");

                }

       }

              注意:  更新无法自动刷新,除非我们重启应用程序。

     


    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Windows Azure Platform China Blog: http://blogs.msdn.com/azchina/default.aspx
    2010年6月14日 1:15
    版主
  • 4.3. 如何将HTML元素融入Silverlight应用程序?

    首先将Silverlight应用程序的 Windowless 属性设为 “True”。一旦Windowless 属性设为 True, Silverlight 插件和 HTML 页面便会在同一个窗口内被渲染。否则,插件会在其自己的窗口内被渲染。

     

    将你的内容加入一个div中,并强制其显示与你的Silverlight应用程序之上,我们可以调整该div的Z序。请参考如下代码:

     

    document.getElementById(id).style.zIndex = index;

     

     

           


    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Windows Azure Platform China Blog: http://blogs.msdn.com/azchina/default.aspx
    2010年6月14日 1:15
    版主
  • 4.5. 在Silverlight中如何访问cookie?

           当应用程序托管于网页中时,我们可以通过如下代码访问cookie 。

    public class CookieManager

        {

            public static void SetCookie(string key, string val, TimeSpan? expires)

            {

                SetCookie(key, val, expires, null, null, false);

            }

            public static void SetCookie(string key, string val, TimeSpan? expires, string path, string domain, bool secure)

            {

                StringBuilder fullCookie = new StringBuilder();

                fullCookie.Append(string.Concat(key, "=", val));

                if (expires.HasValue)

                {

                    DateTime expire = DateTime.UtcNow + expires.Value; fullCookie.Append(string.Concat(";expires=", expire.ToString("R")));

                }

                if (path != null)

                {

                    fullCookie.Append(string.Concat(";path=", path));

                }

                if (domain != null)

                {

                    fullCookie.Append(string.Concat(";domain=", domain));

                }

                if (secure)

                {

                    fullCookie.Append(";secure");

                }

                HtmlPage.Document.SetProperty("cookie", fullCookie.ToString());

            }

     

     

            public static string GetCookie(string key)

            {

                string[] cookies = HtmlPage.Document.Cookies.Split(';');

                foreach (string cookie in cookies)

                {

                    string[] keyValue = cookie.Split('=');

                    if (keyValue.Length == 2)

                    {

                        if (keyValue[0].ToString() == key)              

                            return keyValue[1];

                    }

                }

                return null;

            }

        }

                   


    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Windows Azure Platform China Blog: http://blogs.msdn.com/azchina/default.aspx
    2010年6月14日 1:16
    版主
  •  

    5.如何调试OOB应用程序?

    解决方案 1: 

    1. 安装并运行OOB 应用程序
    2. 打开 Visual Studio 2008/2010
    3. 单击 Debug -> “Exceptions” -> select “Common Language Runtime Exceptions”.
    4. 单击 “Tools” -> ”Options” -> ”Debugging”。 不勾选 “Enable Just My Code(Managed Only)”
    5. 单击 “Debug” -> ”Attach to Process”  -> 寻找并添加SLLauncher.exe 进程。

     解决方案 2: 

    1. 在电脑上安装应用程序

    2. 将 Start Action 设置为 “Installed out-of-browser application”

    3. 保存项目中所有文件

    4. 在OOB 应用程序的主窗体中设置断点 :

    5. 按F5,开始调试OOB应用程序

    推荐链接: 

    http://www.silverlight.net/learn/videos/all/out-of-browser-experiences/

    6.在OOB模式下如何得到网络状况?

    为了检测网络状况,需处理NetworkAddressChanged 事件。请参考如下代码 

     

    public MainPage()

    {

           InitializeComponent();

           Loaded += new RoutedEventHandler(MainPage_Loaded);

           NetworkChange.NetworkAddressChanged += new NetworkAddressChangedEventHandler(NetworkChange_NetworkAddressChanged);

    }

     

    void NetworkChange_NetworkAddressChanged(object sender, EventArgs e)

    {

           CheckNetwork();

    }

     

    void MainPage_Loaded(object sender, RoutedEventArgs e)

    {

           CheckNetwork();

    }

     

    private void CheckNetwork()

    {

         if (NetworkInterface.GetIsNetworkAvailable()) { tbNetwork.Text = "Connected"; }

         else { tbNetwork.Text = "Disconnected"; }

    }

     

     

    7. 如何将XAML转换为图像?

    解决方案 1: 

    将XAMP发送至服务器。在服务器端,我们可以使用WPF来渲染XAML,创建截图,并保存为bitmap格式图片,并下载。

     

    解决方案 2:

    使用 WriteableBitmap 将XAML渲染为图像。参考如下链接

    http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.writeablebitmap.aspx

    http://cfx.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=35920 (请参考 CSSL3WriteableBitmap,该示例会展示如何将bitmap保存为文件。 )

     


    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Windows Azure Platform China Blog: http://blogs.msdn.com/azchina/default.aspx
    2010年6月14日 1:17
    版主
  •  

    8. 如何使用Perspective 3D?

    Silverlight 3 中一个新特性时Perspective Transforms。有了 Perspective Transforms ,你可以模拟在3D空间内旋转一个物体。注意:这并不是真正的 3D ( 举例来说,并不支持相机视角,灯光,模型等等), Silverlight 3目前并不支持真正的3D。

    参考如下示例

    <Image x:Name="imgTarantula" Width="400" HorizontalAlignment="Center" VerticalAlignment="Center"   

     Source="http://terraristic.net/photos/Acanthoscurria_geniculata/Acanthoscurria_geniculata_1.jpg">

            <Image.Projection>

                      <PlaneProjection RotationX="45"></PlaneProjection>

            </Image.Projection>

    </Image>

     

    更多内容,请参考我们的All-In-One Code Framework。

    http://cfx.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=35920

    (请参考CSSL3PlaneProjection 项目)

     

    9.  何时并如何使用Isolate Storage?

    五个最常见的使用Isolate Storage的场景如下:

    • 下载的控件
    • 持久化Web应用程序存储
    • 共享组件存储
    • 服务器存储
    • 漫游用户档案

    不推荐使用Isolate Storage的场景 :

    • 存储敏感内容,例如未加密密钥或密码
    • 存储代码
    • 存储配置和部署设置            

    示例如下:

    private void SaveData(string data, string fileName)

    {

                using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())

                {

                    using (IsolatedStorageFileStream isfs = new IsolatedStorageFileStream(fileName, FileMode.Create, isf))

                    {

                        using (StreamWriter sw = new StreamWriter(isfs))

                        {

                            sw.Write(data); sw.Close();

                        }

                    }

                }

            }        

           

            private string LoadData(string fileName)

            {

                string data = String.Empty;

                using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())

                {

                    using (IsolatedStorageFileStream isfs = new IsolatedStorageFileStream(fileName, FileMode.Open, isf))

                    {

                        using (StreamReader sr = new StreamReader(isfs))

                        {

                            string lineOfData = String.Empty;

                            while ((lineOfData = sr.ReadLine()) != null) data += lineOfData;

                        }

                    }

                }

                return data;

            }

     

    我们可以参考如下链接

    http://msdn.microsoft.com/en-us/library/3ak841sy(VS.80).aspx

    http://msdn.microsoft.com/en-us/library/kbcw921f(VS.80).aspx

     


    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Windows Azure Platform China Blog: http://blogs.msdn.com/azchina/default.aspx
    2010年6月14日 1:18
    版主
  •  

    10.  如何使同一页面的2个Silverlight应用程序交互?http://www.silverlight.net/learn/videos/all/localconnection-api/.

    在多个Silverlight应用程序中通信的推荐方法是通过本地的 Connection API ,其通过消息系统实现。这使得不同的  Silverlight应用程序可以发送/接受消息。示例如下: 

               

    namespace Skyscraper

    {

       public partial class MainPage : UserControl

        {

            LocalMessageSender msgSender = new LocalMessageSender("Skyscraper");

     

            public MainPage()

            {

                InitializeComponent();

     

                LocalMessageReceiver receiver = new LocalMessageReceiver("Header");

                receiver.MessageReceived += new EventHandler<MessageReceivedEventArgs>(receiver_MessageReceived);

                receiver.Listen();

     

                CrashingCar.Completed += new EventHandler(CrashingCar_Completed);

            }

     

            void CrashingCar_Completed(object sender, EventArgs e)

            {

                msgSender.SendAsync("crashed");

            }

     

            void receiver_MessageReceived(object sender, MessageReceivedEventArgs e)

            {

                if (e.Message.ToLower() == "startcrash")

                {

                    CrashingCar.Begin();

                }

            }

        }

    }

     

    更多详细信息可以从如下视频教程中获得

     

     

     

    11.  如何指定安装界面?

     

    参考如下

    http://blogs.msdn.com/webnext/archive/2009/03/23/how-to-build-a-good-install-ux-with-silverlight.aspx

    12. 什么是Element Binding?

     

    元素与元素的绑定是Silverlight3的新特性。有了该特性,我们可以根据其他控件的属性值来设置某个控件的属性。以下是一般的元素与元素绑定:

            <TextBox x:Name="tb"></TextBox>

            <TextBlock Text="{Binding Text,ElementName=tb}"></TextBlock>

    该示例中,Textblock 会显示你在上面textbox输入的内容。

    另外, 对于Master/detail 视图场景特别适用,以下是一示例

            <ListBox x:Name="lb" ItemsSource="YourItemsSource"></ListBox>

            <dataFormToolkit:DataForm CurrentItem="{Binding SelectedItem,ElementName=lb}">

            </dataFormToolkit:DataForm>

    在该程序中,无论何时你选择了Listbox中的一项,dataform便会立即自动刷新,显示你所选择的项。

    需要更详细的教程,请参考如下视频

    http://silverlight.net/learn/videos/silverlight-videos/element-to-element-binding/

     


    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Windows Azure Platform China Blog: http://blogs.msdn.com/azchina/default.aspx
    2010年6月14日 1:18
    版主
  •  

    13. 什么是Binary Xml?

     

    一般来讲,Binary Xml 指任何以二进制格式定义了XML紧密表示的规范。这里,你可以理解为会被转化至二进制的任何数据。

    在Silverligth3之前,我们只能使用TextMessageEncoding。这意味着我们所发送和接受的任何信息实质是纯文本。它显然具有很多缺点,例如对带宽的高要求, 低客户端容量,等等。更明确来讲,因为其传输纯文本,数据量相对庞大。(相比较于 BinaryMessageEncoding). 它意味着客户端和服务器需要更多带宽来实现其功能。同样因为庞大数据,服务器会需要更多的处理能力,所以并发的客户端便会减少。

    现在有了BinaryMessageEncoding ,我们便能将数据转化为二进制格式。相较于纯文本格式传输,它实现了巨大的改善。

    以下是如何配置与BinaryMessageEncoding绑定的示例

     <bindings>

          <customBinding>

             <binding name="binaryHttpBinding">

                <binaryMessageEncoding />

                <httpTransport />

             </binding>

          </customBinding>

       </bindings>

     

    另外,你可以通过纯C#代码来使用BinaryMessageEncoding 。你只需写如下几行代码

    BinaryMessageEncodingBindingElement binary = new   BinaryMessageEncodingBindingElement();
    HttpTransportBindingElement transport = new HttpTransportBindingElement();
    CustomBinding binding = new CustomBinding(binary, transport);

    如果你想使得BinaryMessageEncoding 能与Windows Authentication协同合作,请参考如下文章

    http://forums.silverlight.net/forums/t/110022.aspx

     

    14. Silverlight应用程序如何相互交互?

     

    本地消息特性使得2个Silverlight 应用程序可以相互通信

            LocalMessageSender _localsender = new LocalMessageSender(“Sender”);         

           _localsender.SendCompleted += localsender_SendCompleted;

           void localsender_SendCompleted(object sender, SendCompletedEventArgs e)        {               

          if(e.Error!=null)               MessageBox.Show("Cannot connect to another client.");      

           }

    为了接收消息,使用如下代码

                  LocalMessageReceiver messageReceiver = new LocalMessageReceiver("receiver");

                 messageReceiver.MessageReceived += new   EventHandler<MessageReceivedEventArgs>(receiver_MessageReceived);

                  try{    messageReceiver.Listen();     }

            catch (ListenFailedException){

            MessageBox.Show(    "Cannot receive messages." + Environment.NewLine +"There is already a receiver with the name

                                                     'receiver'.",        "LocalMessageReceiver", MessageBoxButton.OK);      

             }

    要获取完整程序代码,请从如下链接下载或在线浏览

          http://cfx.codeplex.com/sourcecontrol/changeset/view/35597?projectName=cfx#679082

    CSSL3LocalMessage 或 VBSL3LocalMessage便是你想要的。

     


    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Windows Azure Platform China Blog: http://blogs.msdn.com/azchina/default.aspx
    2010年6月14日 1:19
    版主
  •  

    15. Silverlight中如何访问本地字体?

     

    目前,我们只能使用 JavaScript API 来访问本地字体。JavaScript 函数如下:

                 Function (plugIn, rootElement) {             

                 this.plugIn = plugIn;   //the Silverlight plugin          

                var gtc = plugIn.settings.GetSystemGlyphTypefaces();

                for (i = 0; i < gtc.count; i++){              

                       gtf=gtf.getItem(i)if (gtf.FontUri == "comic.ttf") {

                      var glyph = rootElement.children.findName("glyph");  glyph.SetSource(gtf,, ""); //must include "" 

               }}}

              

    以下链接是对于如何使用的讨论。另外,它包含了完整实现代码

     http://forums.silverlight.net/forums/t/103128.aspx

     


    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Windows Azure Platform China Blog: http://blogs.msdn.com/azchina/default.aspx
    2010年6月14日 1:20
    版主
  •  

    16. 什么是 Silverlight 导航应用程序(Navigation Application)?

     

    Navigation Application是预定义的应用程序模板,其使的开发人员无需多虑类网站的应用程序的导航部分。应用程序自身提供了美观和大众的导航方法,并具有定制化功能,所以你可以拥有一个独特的应用程序。

                    按以下步骤来构建导航应用程序

                   1. 单击Visual Studio左上角文件按钮。

                   2. 选择‘New Project’.

                   3. 在窗口中,Templates中选择Silverlight,之后选择Silverlight Navigation Application,单击ok。

    之后 Visual Studio 会自动创建应用程序模板。在MainPage.xaml中,我们可以发现导航栏,以及内容框架的定义代码。导航栏的代码如下

                <Border x:Name="LinksBorder" Style="{StaticResource LinksBorderStyle}">

                    <StackPanel x:Name="LinksStackPanel" Style="{StaticResource LinksStackPanelStyle}">

                        <HyperlinkButton x:Name="Link1" Style="{StaticResource LinkStyle}"

                                         NavigateUri="/Home" TargetName="ContentFrame" Content="home"/>

                        <Rectangle x:Name="Divider1" Style="{StaticResource DividerStyle}"/>

                        <HyperlinkButton x:Name="Link2" Style="{StaticResource LinkStyle}"

                                         NavigateUri="/About" TargetName="ContentFrame" Content="about"/>

                    </StackPanel>

                </Border>

     当增加一个新页面时,请在LinksStackPanel 中增加一个新的 HyperlinkButton,这样用户便可以导航至该页面。代码如下:

     

     

     当增加一个新页面时,请在LinksStackPanel 中增加一个新的 HyperlinkButton,这样用户便可以导航至该页面。代码如下:

                <Border x:Name="LinksBorder" Style="{StaticResource LinksBorderStyle}">

                    <StackPanel x:Name="LinksStackPanel" Style="{StaticResource LinksStackPanelStyle}">

                    <HyperlinkButton x:Name="Link1" Style="{StaticResource LinkStyle}" NavigateUri="/Home"

                                                    TargetName="ContentFrame"Content="home"/>                                                                              

                        <Rectangle x:Name="Divider1" Style="{StaticResource DividerStyle}"/>

                                        <HyperlinkButton x:Name="Link2" Style="{StaticResource LinkStyle}"

                                         NavigateUri="/About" TargetName="ContentFrame" Content="about"/>

                                 <Rectangle x:Name="Divider1" Style="{StaticResource DividerStyle}"/>

                                         //newly added seperator so the UI looks nice

                        <HyperlinkButton x:Name="Link2" Style="{StaticResource LinkStyle}"

                              NavigateUri="/NewPage" TargetName="ContentFrame" Content="about"/>

                        //newly added button direct to the new page

                   </StackPanel>

                </Border>

     

     


     

    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Windows Azure Platform China Blog: http://blogs.msdn.com/azchina/default.aspx

    2010年6月14日 1:21
    版主
  •  

    如果你需要在内容框架中导航或访问MainPage的控件,可以参考如下代码

    ((MainPage)App.Current.RootVisual).ControlName  //code before the dot get you the MainPage’s reference

    更多详细信息请参考如下视频

             http://www.silverlight.net/learn/videos/all/navigation-framework/


    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Windows Azure Platform China Blog: http://blogs.msdn.com/azchina/default.aspx
    2010年6月14日 1:24
    版主