Číselný TextBox v UWP

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.

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="">

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.