Jedním z častých problémů, na které vývojáři naráží při portování UWP aplikací do Uno Platform je následující chyba:
Error CS1061 ‘UIWindow’ does not contain a definition for ‘Current’ and no accessible extension method ‘Current’ accepting a first argument of type ‘UIWindow’ could be found (are you missing a using directive or an assembly reference?)
K této chybě může dojít například pokud provedeme v App.xaml.cs
refaktoring na základě doporučení Visual Studio IntelliSense a odstraníme plnou kvalifikaci jmenného prostoru při použití Window.Current
. Kupříkladu z:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Frame rootFrame = Windows.UI.Xaml.Window.Current.Content as Frame; |
Na:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Frame rootFrame = Window.Current.Content as Frame; |
Tento refaktoring se zdá býti neškodným, avšak tato “neškodnost” závisí na kontextu, ve kterém pracujeme. Pro UWP, Android a WASM není žádný problém, ale jakmile se přepneme na iOS přes target platform dropdown:

Dostaneme zničehonic červené podtržení přímo v kódu:

Důvodem je, že Window
ve třídě App
na iOS neodkazuje na implementaci Windows.UI.Xaml.Window
v Uno Platform, ale na vlastnost Window
typu UIWindow
. A kde se tato vlastnost vzala? Odpověď je v tom, jak je třída Windows.UI.Xaml.Application
na iOS v Uno Platform implementována. Když nahlédneme do zdrojového kódu na GitHubu, uvidíme následující deklaraci:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public partial class Application : UIApplicationDelegate | |
{ | |
… | |
} |
Zde tkví náš problém. iOS UIApplicationDelegate
obsahuje vlastnost Window
pro manipulaci s oknem aplikace, takže pokud v rámci kterékoliv třídy zděděné od Application
odkazuje na Window
, vlastnost implicitně dostává přednost před typem Window
, dle pravidel jazyka C#.
Oprava je jednoduchá – použijme plnou deklaraci jmenného prostoru, tedy Windows.UI.Xaml.Window
, kdykoliv chceme pracovat s oknem v UWP/Uno Platform.
Na analogický problém můžeme narazit i na ostatních platformách. Například na Androidu jsem jej při portování aplikace našel při práci s událostmi dragging. Třída DragEventArgs
na Androidu je deklarována jako vložený typ třídy Android.Views.View
, což je vlastně předek všech ovladacích prvků Uno Platform na Androidu:

Chybu opravíme znovu tak, že plně kvalifikujeme typ jmenným prostorem: Windows.UI.Xaml.DragEventArgs
.
Shrnutí
Uno Platform cílí na více platforem, takže vždy pomůže myslet na možnost změny platformy, pro kterou aktuální soubor zdrojového kódu prohlížíme. Jakmile narazíme na chybu, která brání kompilaci, ale v kódu ji nevidíme, přepnutí platformy nám pomůže příčinu problému odhalit.