1. Vytvoření kostry projektu
1. Založte nový projekt Universal Windows Blank App se jménem NoteTaker.Win10 a jménem
solution NoteTaker. Zrušte Show telemetry in the Windows Dev Center
2. Cílem je vytvořit aplikaci na správu poznámek. Uživatelské rozhraní aplikace bude na nejvyšší
úrovni tvořeno komponentou SplitView, která bude zobrazovat:
- ve svém panelu seznam poznámek
- ve zbytku obrazovky detail vybrané poznámky
3. Ponechte v obrazovce existující Grid a do něj přidejte SplitView.
4. V rámci SplitView umístěte do jeho části Pane komponentu ListView:
2. Příprava vzorových dat
1. Obrazovku MainPage.xaml otevřete v nástroji Blend
2. V panelu data vybereme projekt a dáme New Sample Data
3. Vytvoříte v projektu datový zdroj NotesSampleDataSource
4. Z datového zdroje odebereme „Groups“
5. Vytvoříme novou kolekci Notes (Add colletion property)
6. Vytvořte Simple property
– Created (formát datum)
– NoteText (text, max. 25 slov)
– Title (text, max. 8 slov)
7. Přes příkaz Edit sample values si zkontrolujte, jaké hodnoty byly vygenerovány
8. Máte připravená vzorová data, nyní vytvoříme vazbu mezi daty a ovládacím prvkem
vypisujícím seznam položek: Přetáhněte myší kolekci Notes na ovládací prvek NotesListView
9. Měla by se v designéru ukázat vzorová data.
10. Uložte všechny změny v projektu v Blendu a zavřete jej.
11. Ve Visual Studiu potvrďte, že chcete znovu načíst všechny změněné soubory
12. Spusťte aplikaci.
Je vidět prázdné okno protože panel je uzavřený, přidáním vlastnosti IsPaneOpen="True" do
SplitView jej zobrazíte. Přidejte dále vlastnost DisplayMode="Inline".
3. Úprava šablony položky
1. Blend předgeneroval šablonu položky v seznamu, seznamte se s ní.
2. Opravte bindingy tak, aby první řádek textu byla property Title, druhý řádek property
Created.
3. Jako cvičení odstraňte Použitý Grid a StackPanel a nahraďte jej RelativePanelem, aby se ale
nezměnil vzhled UI. Doporučuji původní Grid pouze zakomentovat a udělat si screenshot
obrazovky pro porovnání.
4. Zmenšete velikost obrázku na 60x60px a odstraňte pevnou výšku položky. Vyzkoušejte
aktivovat zalamování textů.
4. Zobrazení detailu poznámky
1. Implementujte zobrazení detailu poznámky do pravá části okna aplikace.
2. Do SplitView umístěte ScrollView s RelativePanelem a v něm sestavte detail poznámky (bez
editace, jen čtení). Možný výsledek:
3. Aby se zobrazoval detail vybrané položky, bude třeba vybranou položku nastavit jako datový
kontext RelativePanelu, který tvoří detail poznámky. Toho docílíte nastavením property
DataContext RelativePanelu: DataContext="{Binding SelectedItem,
ElementName=NotesListView}"
4. Pro zobrazení klasických textů u vybrané položky, použijte klasické bindingy, např.:
Text="{Binding Title}"
5. Pokud není vybrána žádná položka, zařiďte ať je skrytý rámeček na obrázek. Za tímto účelem
využijeme Converter. V projektu založte složku Converters a vytvořte v ní veřejnou třídu
NullToVisibilityConverter implementující rozhraní IValueConverter
6. Pokud je vstupní hodnota value metody Convert null, potom vracejte
Windows.UI.Xaml.Visibility.Collapsed v opačném případě Visible.
7. Instanci converteru vytvoříme jako aplikační resource. V souboru App.xaml přidejte using
namespace do hlavičky: xmlns:converters="using:NoteTaker.Win10.Converters" a poté i
celý klíč s danou resource:
8. Do ScrollVieweru přidejte nastavení property Visibility s využitím converteru:
Visibility="{Binding SelectedItem, ElementName=NotesListView,
Converter={StaticResource NullToVisibilityConverter}}"
9. Vyzkoušejte, že zmizel šedý rámeček, pokud není vybraná žádná položka a při vybrání
položky se stále zobrazí detail
5. Implementace přizpůsobení se velikosti obrazovky
1. Zkuste si zmenšit velikost okna aplikace a uvidíte, že aplikace se stává nepoužitelnou, protože
UI se nijak nepřizpůsobí změně velikosti okna. Stejně tak můžete aplikaci zkusit nasadit na
mobilní telefon či do emulátoru.
2. Navrhněte, jak by se mohlo uživatelské rozhraní měnit v závislosti na velikosti obrazovky, a
tyto změny popište pomocí vizuálních stavů. Ukázka takového popisu je uvedena níže:
3. Vyzkoušejte tyto změny stavů UI naimplementovat.
6. Implementace vrstvy model
1. Vytvořte v projektu složku Models
2. V této složce implementujte třídu Note, která bude ukládat všechna data o poznámce:
public class Note
{
public int NoteID { get; set; }
public string Title { get; set; }
public string NoteText { get; set; }
public DateTime Created { get; set; }
}
3. V modelu dále implementujte rozhraní, které bude předepisovat operace nad úložištěm
poznámek:
public interface INotesManager
{
System.Collections.Generic.List GetNotes();
void InsertNote(Note note);
void UpdateNote(Note note);
void DeleteNote(Note note);
}
4. Implementujte třídu public class TestNotesManager : INotesManager, která bude vracet
statický seznam poznámek, jako vzorová data pro testování aplikace
7. Implementace vrstvy View-Model
1. Vytvořte v projektu složku ViewModels
2. Pro zjednodušení práce s implementací INotifyPropertyChanged vytvoříme bázovou třídu,
která bude obsahovat pomocný kód:
public abstract class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged([CallerMemberName]string propertyName =
"")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
3. Implementujte třídu NoteViewModel, která bude dědit z ViewModelBase a bude mít
následující vlastnosti:
a. V konstruktoru přijme instanci Note
b. Pomocí veřejných property zpřístupní property třídy Note
c. Pokud dojde ke změně property, vytvoří notifikaci:
public string Title
{
get
{
return note.Title;
}
set
{
if (note.Title != value)
{
note.Title = value;
NotifyPropertyChanged();
}
}
}
4. Implementujte třídu MainPageViewModel, která bude dědit z ViewModelBase a bude mít
následující vlastnosti:
a. V konstruktoru přijme instanci INotesManager a uloží si ji.
b. Bude mít property implementující INotifyPropertyChanged:
i. public ObservableCollection Notes
ii. public NoteViewModel SelectedNote
c. Bude mít metodu public void LoadData(), která načte data z INotesManageru.
7. Propojení View a View-Modelu
1. V MainPage.xaml odstraňte NotesSampleDataSource jako hlavní zdroj dat, ponechte jej jen
pro design.
2. V třídě MainPage vytvořte private field uchovávající ViewModel stránky MainPageViewModel
viewModel
3. V konstruktoru stránky vytvořte instanci ViewModelu a přiřaďte jako DataContext celé
obrazovky (this.DataContext = viewModel;)
4. Při navigaci na stránku zavolejte načtení dat nad ViewModelem:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedFrom(e);
viewModel.SaveChangedNotes();
}
5. Zajistěte, aby vybraná položka v seznamu poznámek byla načtena do property SelectedNote
ViewModelu: SelectedItem="{Binding SelectedNote, Mode=TwoWay}"
6. Detail poznámky nenačítejte podle ListView, ale z property SelectedNote