Diskuze: [WPF] Jak povolit v TextBoxu pouze číslice
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 9 zpráv z 9.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Podle mě by si měl porovnávat jak shift tak zvolenou klávesu
if (Keyboard.IsKeyDown(Key.LeftShift) && Keyboard.IsKeyDown(Key.D0) || Keyboard.IsKeyDown(Key.D1) ..... )
a pak nějakou podmínku které bude porovnávat jestli se opravdu jedná o číslo a pokud ne tak aby v případě stisknutí příslušných kláves znak nahradilo za číslo, shift + d1 otestovat pokud by se nejednalo o číslo nahradí to číslem 1 atd
Myšlenka dobrá, ale moc se mi nelíbí, že by to byla taková mega podmínka. Napadlo mě ještě, jak by to možná šlo jednoduše a zbavit se tak toho, že je jedno, na co mačkám a jakou mám klávesnici.
V té události něco jako:
private void TimeInput_KeyDown(object sender, KeyEventArgs e)
{
if (!int.TryParse(KeyValue, out k))
e.Handled = true;
}
Ale nevím, jak získat value té klávesy.
Zkus použít PreviewTextInput event.
private void TimeInput_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
if (!int.TryParse(e.Text, out _))
e.Handled = true;
}
Proč hned parsovat?
Stačí použít přesně stejnou metodu jakou použil
IsDigit() - jen tu z třídy Char.
Ta vrací true, pokud znak je číslice.
if(Char.IsDigit(e.Text)) e.handled = true ;
Tudíž místo dvou řádků bych musel mít něco jako:
char[] characters = e.Text.ToCharArray();
foreach (char c in characters)
{
if (!char.IsDigit(c))
e.Handled = true;
}
Proč to dělat jednoduše, když to jde složitě?
Jde to mnohem jednodušeji:
if (e.Text.Any(char.IsDigit))
...
Událost PrewiewTextInput ti zachytává každou změnu textu - a tou změnou
je vlastně jeden jediný - poslední zadaný znak.
Kontroluje tedy to, co přijde z klávesnice, ještě před tím, než se to
zapíše do textu TextBoxu.
To
e.Handled = true ;
vlastně zabrání tomu, aby se ten znak z klávesnice připojil k textu TextBoxu.
Teď si uvědomuju, že podmínku jsem napsal špatně a má vypadat takto:
if (!char.IsDigit(e.Text, 0)) e.Handled = true;
Zobrazeno 9 zpráv z 9.