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}:為資源檔名稱;
透過實際案例來看:
我有二個專案: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