Nastavení projektů systému Windows

Přidání nových projektů Windows do existujícího Xamarin.Forms řešení

Starší Xamarin.Forms řešení (nebo ta, která jsou vytvořená v systému macOS), nebudou mít Univerzální platforma Windows (UPW) projekty aplikací. Proto budete muset ručně přidat projekt UPW pro sestavení aplikace pro Windows 10 (UPW).

Přidání Univerzální platforma Windows aplikace

Visual Studio 2019 ve Windows 10 se doporučuje vytvářet aplikace pro UPW. Další informace o Univerzální platforma Windows najdete v tématu Úvod do Univerzální platforma Windows.

UPW je k dispozici ve Xamarin.Forms verzi 2.1 a novější a Xamarin.Forms.Mapy se podporuje ve Xamarin.Forms verzi 2.2 a novější.

Užitečné tipy najdete v části věnované řešení potíží.

Podle těchto pokynů přidejte aplikaci pro UPW, která se bude spouštět na telefonech, tabletech a stolních počítačích s Windows 10:

1. Klikněte pravým tlačítkem na řešení a vyberte Přidat > nový projekt... a přidejte prázdný projekt aplikace (Universal Windows):

Add New Project Dialog

2. V dialogovém okně Nový Univerzální platforma Windows Project vyberte minimální a cílové verze Windows 10, na kterých bude aplikace běžet:

New Universal Windows Platform Project Dialog

3. Klikněte pravým tlačítkem na projekt UPW a vyberte Spravovat balíčky NuGet... a přidejte Xamarin.Forms balíček. Zajistěte, aby se ostatní projekty v řešení aktualizovaly také na stejnou verzi Xamarin.Forms balíčku.

4. Ujistěte se, že se nový projekt UPW sestaví v okně nástroje Build > Configuration Manager (pravděpodobně k tomu ve výchozím nastavení nedojde). Zaškrtněte políčka Sestavení a nasazení univerzálního projektu:

Configuration Manager Window

5. Klikněte pravým tlačítkem myši na projekt a vyberte Přidat > odkaz a vytvořte odkaz na Xamarin.Forms projekt aplikace (.NET Standard nebo sdílený projekt).

Reference Manager Dialog

6. V projektu UPW upravte App.xaml.cs zahrnout Init volání metody uvnitř OnLaunched metody kolem řádku 52:

// under this line
rootFrame.NavigationFailed += OnNavigationFailed;
// add this line
Xamarin.Forms.Forms.Init (e); // requires the `e` parameter

7. V projektu UPW upravte MainPage.xaml odebráním obsaženého Grid v elementu Page .

8. V souboru MainPage.xaml přidejte novou xmlns položku pro Xamarin.Forms.Platform.UWP:

xmlns:forms="using:Xamarin.Forms.Platform.UWP"

9. V souboru MainPage.xaml změňte kořenový <Page element na <forms:WindowsPage:

<forms:WindowsPage
...
   xmlns:forms="using:Xamarin.Forms.Platform.UWP"
...
</forms:WindowsPage>

10. V projektu UPW upravte MainPage.xaml.cs odebrání : Page specifikátoru dědičnosti pro název třídy (protože se teď dědí z WindowsPage důvodu změny provedené v předchozím kroku):

public sealed partial class MainPage  // REMOVE ": Page"

11. V MainPage.xaml.cs přidejte LoadApplication volání do MainPage konstruktoru Xamarin.Forms pro spuštění aplikace:

// below this existing line
this.InitializeComponent();
// add this line
LoadApplication(new YOUR_NAMESPACE.App());

Poznámka:

Argumentem metody LoadApplication je instance definovaná Xamarin.Forms.Application v projektu .NET Standard.

12. Přidejte všechny místní zdroje (např. soubory obrázků) ze stávajících projektů platformy, které jsou požadovány.

Řešení problému

"Výjimka volání cíle" při použití řetězce nástrojů Compile with .NET Native

Pokud aplikace pro UPW odkazuje na více sestavení (například knihovny ovládacích prvků třetích stran nebo samotná aplikace je rozdělená do více knihoven), Xamarin.Forms nemusí být možné načíst objekty z těchto sestavení (například vlastní renderery).

K tomu může dojít při použití řetězu nástrojů Compile with .NET Native, což je možnost pro aplikace UPW v okně Vlastnosti > Sestavení > obecné pro projekt.

Můžete to vyřešit pomocí přetížení Forms.Init volání specifické pro UPW v App.xaml.cs , jak je znázorněno v následujícím kódu (měli byste nahradit ClassInOtherAssembly skutečnou třídou odkazy na kód):

// You'll need to add `using System.Reflection;`
List<Assembly> assembliesToInclude = new List<Assembly>();

// Now, add in all the assemblies your app uses
assembliesToInclude.Add(typeof (ClassInOtherAssembly).GetTypeInfo().Assembly);

// Also do this for all your other 3rd party libraries
Xamarin.Forms.Forms.Init(e, assembliesToInclude);
// replaces Xamarin.Forms.Forms.Init(e);

Přidejte položku pro každé sestavení, které jste přidali jako odkaz v Průzkumník řešení, a to buď prostřednictvím přímého odkazu, nebo NuGetu.

Dependency Services a kompilace .NET Native

Sestavení vydaných verzí využívající kompilaci .NET Native můžou selhat při řešení závislostí služeb, které jsou definované mimo hlavní spustitelný soubor aplikace (například v samostatném projektu nebo knihovně).

Metodu DependencyService.Register<T>() použijte k ruční registraci tříd služby závislostí. Na základě výše uvedeného příkladu přidejte metodu register takto:

Xamarin.Forms.Forms.Init(e, assembliesToInclude);
Xamarin.Forms.DependencyService.Register<ClassInOtherAssembly>(); // add this