Číselný TextBox v UWP

WinUI XAML

5 years ago

Ovladací prvek TextBox v UWP podporuje obecný textový vstup, ale v některých situacích můžeme preferovat omezit jej pouze na číslice. V tomto článku ukážu dva možné přístupy jak toto rychle implementovat.

Zamezení nečíselného vstupu

Pokud chceme zajistit, aby do TextBoxu nebylo vůbec možné zadat nečíselné znaky, můžeme použít událost BeforeTextChanging.

V jejím handleru použijeme jednoduchou LINQ query na kontrolu, zda se vstup skládá pouze z číslic. Pokud ne, jednoduše pokus o změnu zrušíme vlastností Cancel.

Filtrování nečíselného vstupu

Namísto zamezení nečíselného vstupu můžeme také pouze vyfiltrovat nečíselné znaky. V tomto případě můžeme použít událost TextChanging, která se pro tuto situaci skvěle hodí, jak říká dokumentace (přeloženo do češtiny):

Když dojde k události TextChanging, vlastnost Text již reflektuje novou hodnotu (ale není ještě renderována v UI). Typicky zpracujete tento even k aktualizaci hodnoty Text a výběru předtím, než je text vyrenderován. To zabraňuje "probliknutí" ke kterému by došlo, kdyby byl text vykreslen a následně změněn a okamžitě překreslen.

Handler události znovu využívá LINQ díky čemuž je logika jasná a jednoduchá. Vezmeme vlastnost Text a nahradíme ji verzí obsahující pouze číselné znaky.

Poznámka: Obě uvedená řešení fungují pro jednoduchý číselný vstup. Mohou být rozšířena pro obecnější číselný zápis jako pro desetinná čísla nebo o podporu rozdělovačů mezi tisíci. V těchto případech je však nutné mít na paměti, že v každém jazyce je jiný styl formátování vstupu, takže je většinou vhodnějšízajistit správné nastavení vlastnosti TextBox.InputScope a následně provést validaci vstupu přímo v kódu pomocí zabudovaných metod TryParse v .NETu, které podporují formátování dle zadané kultury.