XAMARIN XAML
28.02.2021
- XAML - eXtensive Application Markup Language využitelný hlavně v WPF, SilverLight, Xamarin.Forms, UWP
- Nový projekt pro Xamarin "Mobile App(Xamarin Forms)" a zde vyber Flyout/Tabbed (Flyout je navigace z Menu,Tabbed pomocí záložek)
- Existují dvě základní třídy s xaml App (Application) a MainPage (ContentPage)
- x:Class určuje jméno obslužné třídy odvozené od ContentPage/Application
- každá odvozená třída je "partial", a má svého generovaného sourozence v bin *.xaml.g.cs. Generuje překladač. LoadFromXML a FindByName metody.
- Do App zadaj attribut MainPage v kódu. může být tvoje MainPage nebo častěji "new NavigationPage(new MainPage())"
- ContentPage obsahuje několik Layout, které lze ale vnořovat do sebe. StackLayout, AbsoluteLayout, RelativeLayout, Grid, FlexLayout
- Vytvoření 2x Button a stránky HelloPage.xaml. Ukázka navigace z buttonu přes
await Navigation.PushAsync(new HelloPage());
- XAML a interakce s kódem. Tj nejprve přidání 2x button do již existujícího layoutu (přes ContentView) na MainPage. Poté Nová stránka SliderPage.
- Slider Page obsahuje Slider, jehož potažením se mění zobrazovaná hodnota v Label. K tomu jsou potřeba pojmenovat Label i Slider. (x:Name)
- Slider obsahuje i button co zobrazí zprávu na obrazovce via DisplayAlert
Prvek vlastností (property element) - Trochu speciální způsob zápisu XML Label.TextColor je název třídy.název vlastnosti aby bylo možno psát dovnitř nových značek např col,row apod.
Sdílené prostředky
- můžeš definovat třeba jednu barvu pro všechny barvy v Xaml souboru. A pak měnit na jednom místě
- ResourceDictionary je vlastně jen Dictionary, které využiješ pomocí složených závorek
HorizontalOptions="{StaticResource horzOptions}"
- <DynamicResource> vers. <ResourceDictionary>.Formální zápis je stejný, ale Dynamic se dá měnit za běhu programu.
- <x:Double x:Key="rotationAngle">-15</x:Double>
Pokud chceš definovat něco jiného než string, použij přesnější definici
- OnPlatform - a ještě je možné do proměnné nastavit jednu z platforem (iOS,Android,UWP)
- x:Static - lze se z XAMl odkázat na proměnnou z kódu. Vlastního i systémového. WidthRequest="{x:Static sys:Math.PI}"
- {x:Null} - pokud potřebuješ něco nastavit na null
- {x:Type someClass} - jako type můžeš deklarovat jakýkoliv objekt
- Pole lze definovat použitím x:Array a Type, což definuje typ prvků pole
- ConstraintExpression - jako hodnotu XAML prvku můžeš napsat také rozšířené značky (více značek v k jedné proměnné XAML). Zde musíš dvojice oddělovat čárkami.
Příklad Bind1.xaml kde posunem Slideru otáčíš titulkem ROTATION.
- BindingContext ukazuje na zdrojový objekt. SetBinding ukazuje na cílový objekt pro svázání 'nové' vlastnosti objektu s vlastností zdrojového objektu.
- BindingContext="{x:Reference Name=slider} odkazuje na slider. Stačí slider, to name je redundatní (ContentProperty x:Reference je totiž Name)
- Rotation="{Binding Path=Value}, Text="{Binding Value, StringFormat='The angle is {0:F0} degrees'}" dvojí zápis téhož, neboli kde brát hodnotu. Všimni čárky - tj. výše zmíněná rozšířená značka (markup extension)
- Všimni StringFormat, který asi použiješ vždy, když proměnná není string (lze ještě zadat konvertor typu.). Je tam problém s dvojím {} takže ten string musí být v jednoduchých uvozovkách
Režim vazby
Mode vlastnost řeší kterým směrem bude nastaven Binding
- Default
- OneWay – hodnoty se přenesou ze zdroje do cíle.
- OneWayToSource – hodnoty se přenesou z cíle do zdroje.
- TwoWay – hodnoty jsou přenášeny oběma způsoby mezi zdrojem a cílem.
- OneTime – data přecházejí ze zdroje do cíle, ale pouze při BindingContext změně
Příklady
- App.xaml - do MainPage - což je hlavní stránka - dá MainPage1. Jinak se zde ještě definuje OnStart/OnSleep/OnResume
- MainPage.xaml - button staticky i dynamicky v ContentView. Stacklayout vnořený do dalšího StackLayout
- MainPage1.xaml - Zastřešující stránka, která obsahuje odkaz na všechny ostatní příklady. ListView Bindován na PageDataViewModel (MVVM). Model obsahuje jediný prvek All což je List všech příkladů (Type, Title, Description). Obslužná rutina v MainPage.xaml.cs
- HelloPage.xaml - 2x label ve stackLayout
- SliderPage.xaml - Odkazování z backgroudu do xaml přes název proměnné. Volání backgroudu ze Slideru přes ValueChanged. Button + obsluha, která zobrazí zprávu (DisplayAlert)
- GridDemoPage.xaml - Rozvržení obrazovky Grid. Uvniř je Lavel a BoxView. Každý prvek umístíš do Gridu. No Backgroud
- GridChessPage.xaml - Rozvržení obrazovky AbsoluteLayout. No Backgroud.
- XamlResource.xaml - Použití ResourceDictionary ve StackLayout. No Backgroud.
- xStatic.xaml - Použití proměnných z backgroudu (zde local knihovna XAmpSamples a v ní třída AppConstants a sys knihovna). sys:Math.PI. Jak měnit proměnné na základě iOS/Android/UWP. No backgroud resp. žádný výkonný
- Bind1.xaml - na základě pohybu Slideru se mi mění Rotace labelu1 a label2 o aktuálním nastavení Slideru. Je to proto, že oba labely jsou nabindovány na Slider a jeden z něho mění Rotation (na základě Value) a druhý jen Text (via StringFormat). No background - vše se děja na popředí
- Bind2.xaml - Grid obsahuje 5 řádků a 2 sloupce. Nahoře je label:Text. Ve čtyřech spodních jsou Slidery pro Scale,Rotation,RotationX,RotationY. Rozdíl pro OneWay,TwoWay,OneWayToSource,Default. Ale tady je to naopak. Jednotlivé Slidery jsou nabindovány na vlastnosti Textu.
- BindColor1.xaml - zobrazení všech barev z NamedColor, ktere jsou ListView. K nevíře, stačí na to jeden řádek. Ale zobrazí se jen název objektu
- BindColor2.xaml - dtto, jen v Cell zobrazíme FriendlyName
- BindColor3.xaml - zde už v řádku zobrazíš vzorek barvy (BoxView), název barvy a RGB zastoupení barev. Navíc si velikost řádku měníš dle iOS/Android pomocí ResourceDictionary OnPlatform. Třída DoubleToIntConverter je použita pro konverzi 3 prvků sytosti barvy
- KeyPadPage.xaml - klávesnice telefonu. Navázáno na třídu KeypadViewModel. Ta je rozšířená o metody AddCharCommand() a DeleteCharCommand().
- Date1Static.xaml - zobrazí datum na základě nabindování celého StackLayout na sys:DateTime.Now. pak se jednotlivé labely nabindují na DayMinute apod. Obsahuje i dynamicky nabindovaný Label na moji MVVM třídu ClockViewModel.myDateTime. Tato třída obsahuje PropertyChanged a každou vteřinu ji také volá.
- HSLColor.xaml - + HSMViewModel.cs. 4 Proměnné Huw,Color,Luminosity,Saturation jsou ovládány přes Slider a zároveň zobrazují počítají barvu. Klasika přes PropertyChanged.
Příklady z https://github.com/xamarin/xamarin-forms-samples najdeš v d:\Aplikace\Testy\Core+XamarinTutorial\ konkrétně se jedná o xamarin-forms-samples-master\XamlSamples
Jak rozchodit REST aplikaci s Xamarinem Návod zde
- Vytvoříš certifikát na localhost (dotnet dev-certs https --trust)
- Je potřeba použít alias adresu 10.0.2.2
https://10.0.2.2:/api/todoitems/
- Pokud vyvíjíš aplikaci pro více plaforem je idealni rozliseni pres DeviceInfo.
- Existuje možnost že ti bude ve spojení bránit FireWall
- Nic nezabrani chybě. že máš neplatný certifikát (jdeš přes IP adresu). Tu můžeš obejít přes handler.ServerCertificateCustomValidationCallback
- Pokud chceš přenášet REST API rozhraní přes nešifrovaný přenos musíš to povolit v network_security_config.xml