WPF 與 Xamarin.Forms:相似度和差異
控制項範本
WPF 支援控制項範本的概念,其提供控制件的視覺效果指示 (Button
、 ListBox
等) 。 如上所述,Xamarin.Forms 會為此使用具體 轉譯 類別,以與原生平臺 (iOS、Android 等) 互動,將控件可視化。
不過,Xamarin.Forms 確實 有一個 ControlTemplate
型別, 用於主題 Page
物件。 它提供 提供一致內容的 定義 Page
,但可讓頁面的用戶變更色彩、字型等,甚至新增元素,使其對應用程式而言是唯一的。
常見的用法包括驗證對話框、提示和提供標準化但可主題的頁面外觀和風格,可在應用程式內自定義。 在此支援中,會使用許多熟悉的 WPF 命名控制項:
ContentPage
ContentView
ContentPresenter
TemplateBinding
但請務必知道,這些在 Xamarin.Forms 中並未 提供相同的用途。 如需此功能的詳細資訊,請參閱 文件頁面。
XAML
XAML 會作為 WPF 和 Xamarin.Forms 的宣告式標記語言。 在大部分情況下,語法是相同的 - 主要差異是 XAML 圖形所定義/建立的物件。
Xamarin.Forms 支援 XAML 2009 規格;這可讓您更輕鬆地定義 s、
int
s 等數據string
,以及定義泛型型別,並將自變數傳遞至建構函式。目前沒有任何方法可以動態
XamlReader
載入 XAML,例如 WPF 可以使用 。 不過,您可以使用 NuGet 套件取得相同的基本功能。
標記延伸
Xamarin.Forms 支援透過標記延伸來擴充 XAML,就像 WPF 一樣。 現用即用,它有相同的基本建置組塊:
{x:Array}
{Binding}
{DynamicResource}
{x:Null}
{x:Static}
{StaticResource}
{x:Type}
此外,它包含 {x:Reference}
來自 XAML 2009 規格,以及 {TemplateBinding}
標記延伸,用於 Xamarin.Forms 支援的特殊版本 ControlTemplate
。
警告
雖然 ControlTemplate
支援的名稱相同,但支援並不相同。
Xamarin.Forms 也支援自定義標記延伸,但實作稍有不同。 在 WPF 中,您必須衍生自 MarkupExtension
- 抽象基類。 在 Xamarin.Forms 中,會取代為介面或IMarkupExtension<T>
更有彈性的 介面IMarkupExtension
。
就像WPF一樣,單一必要方法是從 ProvideValue
標記延伸傳回值的方法。
系結基礎結構
其中一個核心概念是數據系結基礎結構,用來將視覺屬性連接到 .NET 數據屬性。 這可啟用MVVM等架構模式。 基本設計相同 - 您在 WPF 中有可系結基類 BindableObject,這是 DependencyObject 類別。 這個基類會做為數據系結中目標參與之所有物件的根祖系。 然後,衍生類別會公開 BindableProperty 物件,做為屬性值支援記憶體(這些物件定義為 WPF 中的 DependencyProperty 物件)。
定義可系結屬性
Xamarin.Forms 中可繫結屬性的定義與 WPF 相同:
- 物件必須衍生自
BindableObject
。 - 必須宣告類型的
BindableProperty
公用靜態字段,才能定義 屬性的備份儲存密鑰。 - 應該有使用和
SetValue
來擷取和變更屬性值的公用實例屬性包裝GetValue
函式。
如需完整的範例,請參閱 Xamarin.Forms 中的可系結屬性。
附加屬性
附加屬性是可系結屬性的子集,而且它們的運作方式與 WPF 相同。 主要差異在於在此案例中省略屬性包裝函式,並以擁有類別上的一組靜態 get/set 方法取代。 如需詳細資訊,請參閱 Xamarin.Forms 中的附加屬性。
使用系結引擎
使用系結引擎的程式與 WPF 中的程式相同。 它可以在程式代碼後置中使用,方法是建立 Binding
系結至來源物件 (任何 .NET 類型) 和選擇性屬性值的物件 (如果省略,它會將來源對象視為屬性本身 - 就像 WPF 一樣)。 然後 SetBinding
,您可以在 任何 BindableObject
上使用 ,將系結與 BindableProperty
產生關聯。
或者,您可以使用 在 XAML BindingExtension
中定義系結關聯性。 它具有與 WPF 中擴充功能相同的基本值。
系結支援和引擎比 WPF 更類似 Silverlight 實作。 在 Xamarin.Forms 中未實作幾個遺漏的功能:
- 系結中不支援下列功能:
- BindingGroupName
- BindsDirectlyToSource
- IsAsync
- MultiBinding
- NotifyOnSourceUpdated
- NotifyOnTargetUpdated
- NotifyOnValidationError
- UpdateSourceTrigger
- UpdateSourceExceptionFilter
- ValidatesOnDataErrors
- ValidatesOnExceptions
- ValidationRules 集合
- XPath
- XmlNamespaceManager
RelativeSource
不支持 RelativeSource
系結。 在 WPF 中,這些可讓您系結至 XAML 中定義的其他視覺元素。 在 Xamarin.Forms 中,您可以使用標記延伸來達成 {x:Reference}
這個相同的功能。 例如,假設我們有名稱為 「otherControl」 且具有 Text 屬性的控件,我們可以像這樣系結至它:
WPF
Text={Binding RelativeSource={RelativeSource otherControl}, Path=Text}
Xamarin.Forms
Text={Binding Source={x:Reference otherControl}, Path=Text}
相同的功能可用於 {RelativeSource Self}
功能。 不過,不支援依類型 ({RelativeSource FindAncestor}
) 尋找祖系。
系結內容
在 WPF 中,您可以定義 DataContext
屬性值,以重新表示預設系結來源。 如果未定義系結的來源,則會使用這個屬性值。 此值會繼承至可視化樹狀結構,使其可在較高層級定義,然後由子系使用。
在 Xamarin.Forms 中,這項相同的功能是可用的,但屬性名稱為 BindingContext
。
值轉換器
Xamarin.Forms 完全支援值轉換器 - 就像 WPF 一樣。 使用相同的介面圖形,但 Xamarin.Forms 有命名空間中 Xamarin.Forms
定義的介面。
Model-View-ViewModel
WPF 和 Xamarin.Forms 完全支援MVVM。
WPF 包含內建 RoutedCommand
的 ,有時會使用;Xamarin.Forms 沒有介面定義以外的 ICommand
內建命令支援。 您可以包含各種不同的MVVM架構,以新增必要的基類來實作MVVM。
INotifyPropertyChanged 和 INotifyCollectionChanged
Xamarin.Forms 系結完全支援這兩個介面。 與許多以 XAML 為基礎的架構不同,屬性變更通知可以在 Xamarin.Forms 的背景線程上引發(就像 WPF 一樣),而且系結引擎會正確地轉換至 UI 線程。
此外,環境都支援 SynchronizationContext
和 async
/await
執行適當的線程封送處理。 WPF 包含 Dispatcher
所有視覺元素上的 類別,Xamarin.Forms 具有靜態方法 Device.BeginInvokeOnMainThread
,也可以使用它(雖然 SynchronizationContext
是跨平臺編碼的慣用方法)。
- Xamarin.Forms 包含
ObservableCollection<T>
支援集合變更通知的 。 - 您可以使用
BindingBase.EnableCollectionSynchronization
來啟用集合的跨線程更新。 API 與 WPF 變化稍有不同, 請檢查檔以瞭解使用方式詳細數據。
資料範本
Xamarin.Forms 支援數據範本,以自定義數據列(儲存格)的轉 ListView
譯。 不同於可用於 DataTemplate
任何內容導向控件的 WPF,Xamarin.Forms 目前只會針對 ListView
使用它們。 範本定義可以內嵌定義(指派給 ItemTemplate
屬性),或做為 中的 ResourceDictionary
資源。
此外,它們不如 WPF 對應項目那麼有彈性。
- 的
DataTemplate
根元素一 律 必須是ViewCell
物件。 - 數據範本中完全支持資料觸發程式,但必須包含
DataType
屬性,指出觸發程式相關聯的屬性類型。 DataTemplateSelector
也受到支援,但衍生自DataTemplate
,因此只會直接指派給ItemTemplate
屬性 (在 WPF 中則為ItemTemplateSelector
)。
ItemsControl
Xamarin.Forms 中沒有內建的對等專案ItemsControl
,但此處提供 Xamarin.Forms 的自定義元件。
使用者控制件
在 WPF 中, UserControl
會使用 來提供 UI 的區段,其具有相關聯的行為。 在 Xamarin.Forms 中,我們會將 用於 ContentView
相同的用途。 同時支援 XAML 中的系結和包含。
導覽
WPF 包含很少使用的 NavigationService
,可用來提供類似瀏覽器的流覽功能。 不過,大部分的應用程式都未對此費心,而是使用不同的 Window
元素或視窗的不同區段來顯示數據。
在電話裝置上,不同的 畫面 通常是解決方案,因此 Xamarin.Forms 包含數種流覽形式的支援:
瀏覽樣式 | 頁面類型 |
---|---|
堆疊型 (推送/流行) | NavigationPage |
主版/詳細 | MasterDetailPage |
索引標籤 | TabbedPage |
向左/向右撥動 | CarouselView |
NavigationPage
是最常見的方法,而且每個頁面都有屬性Navigation
,可用來在流覽堆疊上或關閉快顯頁面。 這是最接近 WPF 中找到的 NavigationService
。
URL 導覽
WPF 是桌面導向的技術,可接受命令行參數來引導啟動行為。 Xamarin.Forms 可以使用 深層 URL 連結 來跳至啟動時的頁面。