Windows Phone - Invoke其他專案的Xaml Page

Windows Phone - Invoke其他專案的Xaml Page

本篇要介紹如果在一個專案裡去Invoke其他專案的畫面,其原因是遇到App在設計時拆分成多個專案檔,

每一個專案檔裡有一些專屬的畫面時,要怎麼在主Page利用NavigationService移動到不同專案的xaml裡。

 

根據<WP7- Navigating to a page in different assembly GeekChamp>的說明,上述情況在於要跨越不同的Assembly,

在那WP裡要導向不同的Page主要分有三個方式:

‧NavigationService.Navigate()

‧NaivgationService.GoBack()

‧利用HyperLinkButton

 

這三個方式主要依整 Resource Path 的方式來找到對象進行導向。相對地,要導向不同的Assembly也是如此。

 

參考<Application Model - Resource Files>的說明,在Silverlight中要deploy Resource分有幾種方式:

 

  • As individual files in the application package.

  • As individual files that you retrieve on demand.

  • As files embedded in an assembly in the application package.

  • As files embedded in an assembly in an external library package.

  • As files embedded in an assembly that you retrieve on demand.

 

可得知XAML畫面所建立的元素被embedded在Assembly之中,而在程式使用Resource的話可藉由URI(Relative或Absolute)的方式取得,

因此,根據「URIs to Other Assemblies」的說明,列出在相同Assembly程式裡與使用外部Assembly在URI的差別:

 

‧相同的Assembly:/{PathToResource}

    例如:/MainPage.xaml、/Assets/Images/Pic.png…等,屬於Internal Assembly下的資源,其使用方式就以root目錄往下。

   

‧外部的Assembly:/{Assembly Name};component/{PathToResource}

    {assembly name}:即是外部參考*.dll的名稱,或是AssemblyInfo.cs中AssemblyTitle的值;

    component:為固定字段;

    {PathToResource}:為資源檔名稱;

 

透過實際案例來看:

image

我有二個專案:BackMedia與LogLib,我要從BackMedia專案開啟LogLib中的LogPage.xaml,那我在MainPage.xaml中要怎麼寫呢?

private void Button_Click(object sender, RoutedEventArgs e)
{
    //指定導向其他Assembly中的Page
    NavigationService.Navigate(
        new Uri("/LogLib;component/LogPage.xaml", 
        UriKind.Relative));
}

其中「/LogLib」的值,來自下方的「AssemblyTitle」:

// General Information about an assembly is controlled through the following 
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("LogLib")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("LogLib")]
[assembly: AssemblyCopyright("Copyright ©  2014")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

 

根據這樣的設定就可以從一個專案開啟至其他專案中的畫面與檔案。

======

以上是簡單介紹如何在一個專案裡可以導向其他專案中的xaml page,這些的方式也一樣可用於存取其他Assembly中的Resources。

我覺得蠻重要的一個觀念,提供給大家,如果有寫錯的地方也請讓我知道,謝謝。

 

References

WP7- Navigating to a page in different assembly GeekChamp (重要)

Application Model - Resource Files

Application Model

Application Structure

Deployment and Localization

 

Dotblogs 的標籤: