zoukankan      html  css  js  c++  java
  • Silverlight经验分享[转]

    只要是在 Silverlight 2.0 中要呼叫外部來源的通訊,幾乎都是要用非同步的作法,而最常和 Silverlight 通訊的,我想非 WCF 莫屬了,並且因為要處理非同步,所以我們可能會這樣寫:

    // 由伺服器撈取目錄,透過 WCF Service 來做。
    private void tvDirectory_SelectedItemChanged(object sender, RoutedEventArgs e)
    {
        TreeViewItem item = this.tvDirectory.SelectedItem as TreeViewItem;

        if (!item.HasItems)
        {
            ServerDirectoryBrowserService.DirectoryInfo di =
                item.Tag as ServerDirectoryBrowserService.DirectoryInfo;

            if (di.HasSubdirectory)
            {
                this.UpdateState("Loading directory information...");

                // load sub directory.
                this._client.GetDirectoriesCompleted +=
                       new EventHandler<GetDirectoriesCompletedEventArgs>
    (this.GetDirectoriesCompleted);

                this._client.GetDirectoriesAsync(di.PhysicalPath);
            }
        }
    }

    private void GetDirectoriesCompleted(object sender, GetDirectoriesCompletedEventArgs e)
    {
        if (e.Error != null)
            // error handler.
        else
        {
            foreach (ServerDirectoryBrowserService.DirectoryInfo di in e.Result)
            {
                TreeViewItem item = new TreeViewItem();
                item.Tag = di;
                item.Header = di.Name;
                (this.tvDirectory.SelectedItem as TreeViewItem).Items.Add(item);
            }
        }

        this.UpdateState("Ready.");
    }

    不過這段程式碼中隱含了一個陷阱,就是 event registration,目前這個版本會在每次要下載目錄時都被註冊一次事件常式,這會導致說你的程式要求幾次,這個事件常式就會被呼叫幾次的問題。

    例如 Server 有兩個磁碟 C 和 D,則剛開始是:

    C:\
    D:\

    後來當要展開 C:\ 時,會列出 C:\ 下的第一個子目錄(第一次呼叫):

    C:\
       C:\1
       C:\2
    D:\

    但當要展開 D:\ 時,會發現事件被呼叫了兩次(第二次呼叫):

    C:\
       C:\1
       C:\2
    D:\
       D:\3
       D:\4
       D:\3
       D:\4

    解決的方法是把事件註冊的程式拿到最前面一開始初始化時,這樣就不會有這個問題了:

    void Page()
    {
        this._client.GetDirectoriesCompleted +=
              new EventHandler<GetDirectoriesCompletedEventArgs>
              (this.GetDirectoriesCompleted);

    }

    // 由伺服器撈取目錄,透過 WCF Service 來做。
    private void tvDirectory_SelectedItemChanged(object sender, RoutedEventArgs e)
    {
        TreeViewItem item = this.tvDirectory.SelectedItem as TreeViewItem;

        if (!item.HasItems)
        {
            ServerDirectoryBrowserService.DirectoryInfo di =
                item.Tag as ServerDirectoryBrowserService.DirectoryInfo;

            if (di.HasSubdirectory)
            {
                this.UpdateState("Loading directory information...");

                // load sub directory.
    this._client.GetDirectoriesAsync(di.PhysicalPath);
            }
        }
    }

    private void GetDirectoriesCompleted(object sender, GetDirectoriesCompletedEventArgs e)
    {
        if (e.Error != null)
            // error handler.
        else
        {
            foreach (ServerDirectoryBrowserService.DirectoryInfo di in e.Result)
            {
                TreeViewItem item = new TreeViewItem();
                item.Tag = di;
                item.Header = di.Name;
                (this.tvDirectory.SelectedItem as TreeViewItem).Items.Add(item);
            }
        }

        this.UpdateState("Ready.");
    }

    ASP.NET Silverlight Control 中有個 InitParameters 的參數,可以設定起始的參數,但是它有個大問題,就是沒有說明要怎麼設定 ...,而在 Silverlight 的 App.xaml 中的 Application_Startup 函式的 StartupArgs 中的 InitParams 又是 IDictionary<string, string> 型別,和 InitParameters 是 string 差別很大,所以我去查了一下網路上的文件,發現它是這樣設定的:

    SilverlightControl.InitParameters = "key1=value1,key2=value2,key3=value3,....";

    這樣就可以在 Application_Startup 中這樣取用:

    string value1 = e.InitParams[key1];
    string value2 = e.InitParams[key2];
    string value3 = e.InitParams[key3];

  • 相关阅读:
    设计模式-策略模式
    java8 流式编程
    《JAVA8开发指南》使用流式操作
    linux如何查看端口被哪个进程占用?
    mac 启动php-fpm报错 failed to open configuration file '/private/etc/php-fpm.conf': No such file or direc
    Mac home 目录下创建文件夹
    UML由浅入深
    PHP扩展Swoole的代码重载机制
    Gedit中文乱码
    linux 内核源码arch/ 目录的前世今生
  • 原文地址:https://www.cnblogs.com/slteam/p/1381931.html
Copyright © 2011-2022 走看看