使用 Portable Class Library(可移植類庫)開發 Universal Windows App

今天在這裏跟你們聊聊關於 Windows Universal 應用誇平臺的問題,首先Universal Windows App的定義相信你們已經有所瞭解了(若是你是一個剛剛接觸 Universal APP 的開發這個請先閱讀一下我以前的文章 Windows Phone 8.1 開發技術概覽 [Universal APP]), 相信你們在這裏最苦惱的事情莫過於在不一樣開發架構下分享代碼了,今天我在這裏給你們推薦一個解決方案使用可移植類庫(Portable Class Library)在不一樣的Windows項目之間分享代碼。(Windows 8.1 / Windows Phone 8.1 )這裏還包括Silverlight開發的 Windows Phone 8.1 應用。html

首先介紹一下什麼是 Portable Class Library,稱之爲‘可移植類庫’(簡稱PCL)支持 C# 語言開發,而且在開發 Universal 類庫時支持UI呈現。 這裏在次強調一下目前只支持C#開發,C# 的語法能夠在 PCL 中使用,方便C# 的開發人員快速上手,而且支持調用 Windows Runtime 的 SDK 例如,網絡訪問,JSON 處理,內容分享等功能。 也很是適合三方SDK開發和功能集成。網絡

如何建立一個 PCL 的類庫呢很是簡單隻須要打開咱們的VS2013(update 2 及以上版本)選擇Universal 應用模板 選擇PCL的項目模板便可,(Component支持 Universal 應用。 DLL 支持Silverlight以及 Windows XAML C# 應用)這裏最大的區別是 DLL 的類庫不容許類庫中使用UI內容。(緣由很是簡單 Universal 應用和 SL的應用架構不一樣)架構

image

經過項目屬性 咱們還能夠經過 Output Type 來切換項目的輸出類型(Component 或 DLL)測試

image

另外 咱們還能夠是經過 Targets 屬性來適配應用的應用適配平臺,這裏要注意的是若是應用跨 Universal 和 Silverlight 平臺 (8.0 和 8.1)類庫內容會受到很大的影響(類庫版本越舊咱們在PCL中可使用的WinRT feature 也就越少),而且PCL 將不能支持UI控件的分享。ui

image

 

上面提到各類限制肯能有些複雜,我用一張圖來給你們說明一下。(這裏針對Universal 8.1 APP 和 Silverlight 應用架構)this

image

1.若是你的類庫只想被Universal 應用調用,那麼你須要選擇 Windows Runtime Component 進行輸出,你的PCL將支持大部分 Windows RT的 Feature 而且支持UI控件的分享,可是WinJS項目不支持 UI 控件的展現,這裏緣由很簡單 XAML上層渲染和 HTML是不一樣的。spa

2.若是你須要你的PCL支持 Silverlight 項目的調用,那麼你須要選擇 Class Library (DLL)進行輸出,你的PCL也能夠支持大部分 Windows RT的 Feature 。可是不能夠進行 UI控件的分享,而且你輸出的DLL將不能被 Universal APP的 C++ XAML 和 HTML WinJS 項目調用。3d

這裏最好的建議就是相同的類庫,若是想讓它同時兼容 Universal 架構(XAML C++/C#  和 HTML WinJS)Silverlight架構,只須要將PCL的輸出類型切換在編譯一次就可。(三方SDK建議這樣作:))code

我這裏給你們一個測試代碼是使用 WinRT中的Share Contract 進行應用間分享。(由於沒有 UI 內容能夠直接 Target 到 Universal 和 Silverlight 項目中去,固然是兩次編譯)component

項目結構(爲了方便這裏我作了 Component 和 DLL 的項目可是項目中的代碼是相同的,固然在開發的時候用link的形勢也能夠)

image

PCL 分享類庫代碼以下

public sealed class ShareText
    {
        private DataTransferManager dataTransferManager;

        public string DataContent { get; set; }

        public ShareText()
        {
            this.dataTransferManager = DataTransferManager.GetForCurrentView();
            this.dataTransferManager.DataRequested += new TypedEventHandler<DataTransferManager, DataRequestedEventArgs>(this.OnDataRequested);
            DataContent = "Share Text From PCL";
        }
        private void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs e)
        {
            // Call the scenario specific function to populate the datapackage with the data to be shared.
            if (GetShareContent(e.Request))
            {
                // Out of the datapackage properties, the title is required. If the scenario completed successfully, we need
                // to make sure the title is valid since the sample scenario gets the title from the user.
                if (String.IsNullOrEmpty(e.Request.Data.Properties.Title))
                {
                    return;
                }
            }
        }
        public bool GetShareContent(DataRequest request)
        {
            bool succeeded = false;

            string dataPackageText = DataContent;
            if (!String.IsNullOrEmpty(dataPackageText))
            {
                DataPackage requestData = request.Data;
                requestData.Properties.Title = "Share Text";
                requestData.Properties.Description = "Share Description"; // The description is optional.
                //requestData.Properties.ContentSourceApplicationLink = GetType().Name;
                requestData.SetText(dataPackageText);
                succeeded = true;
            }
            else
            {
                request.FailWithDisplayText("Enter the text you would like to share and try again.");
            }
            return succeeded;
        }
        public void ShowShareUI()
        {
            // If the user clicks the share button, invoke the share flow programatically.
            DataTransferManager.ShowShareUI();
        }
    }

C# 項目調用

private void Button_Click(object sender, RoutedEventArgs e)
        {
            UniversalComponent.ShareText st = new UniversalComponent.ShareText();

            st.DataContent = "Hello PCL form C#";

            st.ShowShareUI();
        }

C++  項目調用

void UniversalC__App::BlankPage::Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    UniversalPCL::ShareText^ ST = ref new UniversalPCL::ShareText;
    ST->DataContent = "Hello PCL from C++";
    ST->ShowShareUI();
}

HTML + WinJS項目調用

function callComponent() {
var component = new UniversalPCL.ShareText();
    component.dataContent = "Hello form JS";
    component.showShareUI();
}

Silverlight C# 調用

private void Button_Click(object sender, RoutedEventArgs e)
        {
            UniversalComponent.ShareText st = new UniversalComponent.ShareText();

            st.DataContent = "Hello PCL form SL";

            st.ShowShareUI();
        }

咱們能夠在 VS 中測試任意一個平臺的調用狀況

image

這裏我就不逐一展現測試效果了,貼一張 C++ 調用的截圖讓你們過過癮也好 :)

image    image  image

但願上的總結能夠幫助到你們, 同時歡迎你們在這裏和我溝通交流或者在新浪微博上 @王博_Nick

相關文章
相關標籤/搜索