Úprava viditelnosti pojmenovaných XAML elementů

Atribut x:Name v XAMLu vytváří pro elementy členské položky třídy, které lze použít pro přístup k ovladacím prvkům z kódu. Narozdíl od WPF však v UWP jsou tyto položky třídy definovány jako private, což znamená, že k nim je možné přistupovat pouze z třídy samotné. Pokud vezmeme v potaz, že z hlediska architektury by to byl špatný nápad, je možné toto chování změnit?

Výchozí chování

Definujme v XAMLu jednoduchý TextBlock.

Co se nyní stane, pokud vytvoříme novou třídu, která bude chtít změnit na jí předané stránce text tohoto ovladacího prvku?

Aplikaci takto nelze zkompilovat, protože položka není přístupná kvůli její viditelnosti.

Otevřme automaticky generovaný soubor MainPage.g.i.cs (ve složce obj), abychom se podívali, k čemu skutečně dochází:

Vidíme, že položka je deklarována jako private.

Direktiva x:FieldModifier

Pro změnu výchozího chování XAML generátoru kódu můžete použít direktivu x:FieldModifier. Ta vám umožňuje specifikovat přesně který modifikátor přístupu by položka měla mít.

Nyní již je snadno možné přistoupit k položce i z jiné třídy:

Kromě voleb public a private můžete hodnotu direktivy nastavit i jako internal nebo protected.

Výsledek naší snahy můžeme ověřit i ve vygenerovaném zdrojovém kódu:

WPF

Pokud přemítate, jaké je výchozí chování ve WPF, odpověď je nasnadě!

Konvence WPF nastavuje všechny pojmenované položky jako internal:

I zde však můžete použít direktivu x:FieldModifier pro úpravu viditelnosti stejně jako v UWP.

Zdrojový kód

Ukázkový zdrojový kód k tomuto článku najdete na mém GitHubu.

Shrnutí

x:FieldModifier je zajímavá a nepříliš známá direktiva XAMLu. Přesto by její použití mělo být spíše výjimečné, protože členské proměnné viditelnosti jiné než private nejsou nikdy dobrým nápadem. O to překvapivější je, že v případě WPF byla jako výchozí zvolena viditelnost internal.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

*