Share via


WPF 與 Xamarin.Forms:相似度和差異

控制項範本

WPF 支援控制項範本的概念,其提供控制件的視覺效果指示 (ButtonListBox) 。 如上所述,Xamarin.Forms 會為此使用具體 轉譯 類別,以與原生平臺 (iOS、Android 等) 互動,將控件可視化。

不過,Xamarin.Forms 確實 有一個 ControlTemplate 型別, 用於主題 Page 物件。 它提供 提供一致內容的 定義 Page ,但可讓頁面的用戶變更色彩、字型等,甚至新增元素,使其對應用程式而言是唯一的。

常見的用法包括驗證對話框、提示和提供標準化但可主題的頁面外觀和風格,可在應用程式內自定義。 在此支援中,會使用許多熟悉的 WPF 命名控制項:

  1. ContentPage
  2. ContentView
  3. ContentPresenter
  4. TemplateBinding

但請務必知道,這些在 Xamarin.Forms 中並未 提供相同的用途。 如需此功能的詳細資訊,請參閱 文件頁面

XAML

XAML 會作為 WPF 和 Xamarin.Forms 的宣告式標記語言。 在大部分情況下,語法是相同的 - 主要差異是 XAML 圖形所定義/建立的物件。

  • Xamarin.Forms 支援 XAML 2009 規格;這可讓您更輕鬆地定義 s、ints 等數據string,以及定義泛型型別,並將自變數傳遞至建構函式。

  • 目前沒有任何方法可以動態 XamlReader載入 XAML,例如 WPF 可以使用 。 不過,您可以使用 NuGet 套件取得相同的基本功能

標記延伸

Xamarin.Forms 支援透過標記延伸來擴充 XAML,就像 WPF 一樣。 現用即用,它有相同的基本建置組塊:

  1. {x:Array}
  2. {Binding}
  3. {DynamicResource}
  4. {x:Null}
  5. {x:Static}
  6. {StaticResource}
  7. {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 相同:

  1. 物件必須衍生自 BindableObject
  2. 必須宣告類型的 BindableProperty 公用靜態字段,才能定義 屬性的備份儲存密鑰。
  3. 應該有使用和 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 線程。

此外,環境都支援 SynchronizationContextasync/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 對應項目那麼有彈性。

  1. DataTemplate 根元素一 必須是 ViewCell 物件。
  2. 數據範本中完全支持資料觸發程式,但必須包含 DataType 屬性,指出觸發程式相關聯的屬性類型。
  3. 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 連結 來跳至啟動時的頁面。