A Visual Studio c# állapotgépeket használ a szövegdobozban történő bevitel korlátozására. Mellékelt tulajdonságok a szövegbevitel korlátozásához

A gyermekek számára lázcsillapítót gyermekorvos írja fel. De vannak vészhelyzetek a láz miatt, amikor a gyermeknek azonnal gyógyszert kell adni. Ezután a szülők vállalják a felelősséget és lázcsillapító szereket használnak. Mit szabad adni a csecsemőknek? Hogyan lehet csökkenteni a hőmérsékletet idősebb gyermekeknél? Milyen gyógyszerek a legbiztonságosabbak?

A WPF messze nem egy új technológia a piacon, de viszonylag új számomra. És ahogy az új dolgok elsajátításakor lenni szokott, itt is felmerül a vágy/igény a négyszögletes kerekű és alufelnikkel ellátott kerékpárok feltalálására néhány tipikus probléma megoldására.

Az egyik ilyen feladat a felhasználói bevitel korlátozása bizonyos adatokra. Tegyük fel például, hogy azt szeretnénk, hogy az egyik szövegmező csak egész értékeket fogadjon el, a másik egy adott formátumú dátumot, a harmadik pedig csak lebegőpontos számokat. Természetesen az ilyen értékek végső érvényesítése továbbra is megtörténik a nézetmodellekben, de az ilyen beviteli korlátozások barátságosabbá teszik a felhasználói felületet.

A Windows Forms-ban ezt a feladatot meglehetősen egyszerűen megoldották, és amikor a DevExpress ugyanaz a TextBox elérhető volt, beépített reguláris kifejezésekkel korlátozható beviteli lehetőséggel, akkor általában minden egyszerű volt. Jó néhány példa van ugyanennek a problémának a megoldására a WPF-ben, amelyek többsége két lehetőség valamelyikére vezethető vissza: TextBox osztályöröklő használata vagy csatolt tulajdonság hozzáadása a szükséges korlátozásokkal.

JEGYZET
Ha nem nagyon érdekli az érvelésem, de azonnal kódpéldákra van szüksége, akkor letöltheti a teljes projektet
WpfEx a GitHubból , vagy töltse le a fő megvalósítást, amelyet a tartalmazza TextBoxBehavior.cs és TextBoxDoubleValidator.cs .

Nos, kezdjük?

Mivel az öröklődés meglehetősen szigorú korlátozást vezet be, én személy szerint ebben az esetben előnyben részesítem a csatolt tulajdonságok használatát, mivel ez a mechanizmus lehetővé teszi ezen tulajdonságok alkalmazásának korlátozását egy bizonyos típusú vezérlőkre (nem szeretném ezt a csatolt tulajdonságot IsDouble lehet alkalmazni egy TextBlockra, aminek nincs értelme).
Ezenkívül meg kell jegyezni, hogy a felhasználói bevitel korlátozásakor nem használhat konkrét egész és tört elválasztókat (például "." (pont) vagy "," (vessző)), valamint a "+" és "" jeleket. -', mivel minden a felhasználó regionális beállításaitól függ.
Ahhoz, hogy megvalósítsuk az adatbevitel korlátozásának lehetőségét, el kell fognunk az adott felhasználói beviteli eseményt, elemeznünk kell, és el kell vetnünk ezeket a változtatásokat, ha nem felelnek meg nekünk. Ellentétben a Windows Forms-szal, amely eseménypárt használ XXXMódosítvaés XXXVáltozó, a WPF ugyanerre a célra az események előnézeti verzióit használja, amelyeket úgy lehet feldolgozni, hogy a fő esemény ne induljon el. (Klasszikus példa erre az egér- vagy billentyűzetesemények kezelése, amelyek letiltanak bizonyos billentyűket vagy azok kombinációit.)

És minden rendben lenne, ha a TextBox osztály és a TextChanged esemény is tartalmazna PreviewTextChanged, amely feldolgozható és "megszakítható" a felhasználói bevitel, ha a beviteli szöveget hibásnak tartjuk. És mivel nem létezik, ezért mindenkinek és mindenkinek fel kell találnia a saját lisapetét.

A probléma megoldása

A probléma megoldása egy TextBoxBehavior osztály létrehozása, amely tartalmazza a csatolt IsDoubleProperty tulajdonságot, amelynek beállítása után a felhasználó a +, -, karaktereken kívül mást nem tud bevinni ebbe a szövegmezőbe. (egész és decimális elválasztó), valamint számok (ne felejtsük el, hogy az aktuális adatfolyam beállításait kell használnunk, nem pedig a kódolt értékeket).

Nyilvános osztály TextBoxBehavior ( // Logikai típusú csatolt tulajdonság, beállítás, amely korlátozza a felhasználói publikus statikus bevitelt DependencyProperty IsDoubleProperty = DependencyProperty.RegisterAttached("IsDouble", typeof (bool), typeof (TextBoxBehavior), new OnFrameworksDfalse, OnFrameworksDfalse) ; // Ez az attribútum nem teszi lehetővé az IsDouble használatát a TextBoxon vagy annak leszármazottaitól eltérő felhasználói felület elemekkel // public static bool GetIsDouble(DependencyObject elem) () public static void SetIsDouble(DependencyObject elem, bool érték) () / / Meghívva amikor a TextBoxBehavior.IsDouble="True" értéke XAML privát static void OnIsDoubleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) ( // Street magic ) )

A kezelő megvalósításának fő összetettsége PreviewTextInput(valamint a szöveg vágólapról történő beillesztésének eseménye) abban rejlik, hogy az esemény argumentumokban nem a szöveg teljes értéke kerül átvitelre, hanem csak az újonnan beírt része. Ezért az összefoglaló szöveget manuálisan kell kialakítani, figyelembe véve a TextBox szövegkijelölésének lehetőségét, a kurzor pillanatnyi pozícióját benne, és esetleg a Beszúrás gomb állapotát (amit nem elemezünk):

// Meghívás, ha a TextBoxBehavior.IsDouble="True" értéke XAML privát static void OnIsDoubleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) ( // Mivel a csatolt tulajdonságunkat csak a // TextBox osztályra vagy annak következő leszármazottaira korlátoztuk az átalakítás - biztonságos var textBox = (TextBox) d; // Most két fontos esetet kell kezelnünk: // 1. Kézi felhasználói bevitel // 2. Adatok beillesztése a vágólapról textBox.PreviewTextInput += PreviewTextInputForDouble; DataObject.AddPastingHandler( textBox, OnPasteForDouble );)

TextBoxDoubleValidator osztály

A második fontos pont az újonnan beírt szöveg érvényesítési logikájának megvalósítása, amiért a módszer felelőssége. Érvényes külön osztály TextBoxDoubleValidator.

a legtöbben egyszerű módon megérteni, hogyan kell a módszernek viselkednie Érvényes ennek az osztálynak az a célja, hogy írjunk hozzá egy olyan egységtesztet, amely lefedi az összes sarokesetet (ez csak egy azon esetek közül, amikor a paraméterezett egységtesztek szörnyű erővel uralkodnak):

JEGYZET
Pontosan ez az eset áll fenn, ha az egységteszt nem csupán egy teszt, amely bizonyos funkciók megvalósításának helyességét ellenőrzi. Pontosan ez az a helyzet, amelyről Kent Beck többször is beszélt az elszámoltathatóság leírásakor; ezt a tesztet elolvasva megértheti, mire gondolt az érvényesítési módszer fejlesztője, „újrafelhasználhatja” tudását, és hibákat találhat az érvelésében, és így valószínűleg a megvalósítási kódban is. Ez nem csak egy tesztcsomag – ez a módszer specifikációjának fontos része!

Privát static void PreviewTextInputForDouble(object sender, TextCompositionEventArgs e) ( // e.Text csak új szöveget tartalmaz, ezért a TextBox aktuális // állapota nélkülözhetetlen. var textBox = (TextBox)sender; string fullText; // Ha a TextBox tartalmaz kijelölt szöveget, majd cserélje ki e.Text if (textBox.SelectionLength > 0) ( fullText = textBox.Text.Replace(textBox.SelectedText, e.Text); ) else ( // Ellenkező esetben új szöveget kell beszúrnunk a kurzor pozíciója fullText = textBox.Text.Insert(textBox.CaretIndex, e.Text); ) // Most érvényesítse a kapott szöveges bool-ot isTextValid = TextBoxDoubleValidator.IsValid(fullText); // És megakadályozza a TextChanged eseményt, ha a szöveg nem érvényes e.Handled = !isTextValid; )

A tesztmódszer visszatér igaz ha a paraméter szövegérvényes, ami azt jelenti, hogy a megfelelő szöveg beírható szövegdoboz csatolt tulajdonsággal IsDouble. Ügyeljen néhány dologra: (1) az attribútum használata SetCulture, amely beállítja a kívánt területi beállítást és (2) néhány bemeneti értéket, például „-.”, amelyek nem érvényesek a típusra Kettős.

Explicit területi beállításra van szükség, hogy a tesztek ne hibásodjanak meg az egyéb személyes beállításokkal rendelkező fejlesztők számára, mivel az orosz nyelvterületen a ',' (vessző) szimbólumot használják elválasztóként, az amerikaiban pedig - '.' (pont ). Furcsa szöveg, mint a „-”. helyes, mert a felhasználónak be kell fejeznie a bevitelt, ha a „-.1” karakterláncot akarja beírni, ami a helyes értéke Kettős. (Érdekes módon a StackOverflow-t gyakran javasolják a Double.TryParse használatával megoldani ezt a problémát, ami bizonyos esetekben nyilvánvalóan nem működik).

JEGYZET
Nem akarom teleszórni a cikket a módszer megvalósításának részleteivel Érvényes, csak szeretném megjegyezni a ThreadLocal metódus használatát ennek törzsében , amely lehetővé teszi a letöltést és a gyorsítótárat DoubleSeparator helyi minden szálra. A módszer teljes megvalósítása TextBoxDoubleValidator.IsValid további információt találhat ThreadLocal Elolvashatja Joe Albahari Working with Threads című cikkét. 3. rész.

Alternatív megoldások

Az események megörökítése mellett PreviewTextInputés szöveg beillesztése a vágólapról, vannak más megoldások is. Így például találkoztam azzal, hogy megpróbáltam megoldani ugyanazt a problémát az esemény lehallgatásával PreviewKeyDown az összes kulcs szűrésével, kivéve a digitális. Ez a megoldás azonban bonyolultabb, mert még mindig bajlódni kell a TextBox „összefoglaló” állapotával, és pusztán elméletileg az egész és a tört részek elválasztója nem egy karakter, hanem az egész karakterlánc lehet (NumberFormatInfo.NumberDecimalSeparator visszatér húr, de nem char).
Az eseményben van egy másik lehetőség is kulcs le előző állapot mentése TextBox.Text, és az eseményben TextChanged visszaadja a régi értéket, ha az új érték nem felel meg. De ez a megoldás természetellenesnek tűnik, és nem lesz olyan egyszerű megvalósítani a csatolt tulajdonságokkal.

Következtetés

Amikor legutóbb a kollégákkal beszélgettünk arról, hogy hiányoznak a hasznos és nagyon tipikus funkciók a WPF-ben, arra a következtetésre jutottunk, hogy ennek megvan a magyarázata, és ennek van egy pozitív oldala is. A magyarázat abban csapódik le, hogy a szivárgó absztrakciók törvénye elől nincs menekvés, a WPF pedig nagyon összetett "absztrakció" lévén szitaként folyik. A hasznos oldala az, hogy néhány hasznos funkció hiánya néha elgondolkodtat (!) És ne felejtsük el, hogy programozók vagyunk, nem másolás-beillesztés mesteremberek.

Hadd emlékeztesselek arra, hogy a fenti osztályok osztályainak teljes megvalósítása, felhasználási példák és egységtesztek megtalálhatók a githubon.

Címkék: Címkék hozzáadása

Ebben a kézikönyvben megfontoljuk, hogy csak a felhasználótól származó számokat írjunk be. NÁL NÉL Microsoft Visual Studio van vezérlés" MaskedTextBox”, testreszabható beviteli maszkjával, de feltételezzük, hogy ma már csak az érdekel« szövegdoboz».
A feladat végrehajtásához az eseményt használjuk gombnyomás” fordul elő, amikor egy billentyűt lenyomnak, miközben a vezérlő fókuszban van. Hozzon létre egy projektet ablakok formálódnak ban ben Microsoft Visual Studioés adjon hozzá egy vezérlőt a fő űrlaphoz szövegdoboz". Válassza ki ezt az összetevőt, kattintson rá jobb gombbal, és válassza ki a megjelenő helyi menüből a " TulajdonságokgombnyomástextBox1_KeyPress", fejlesztések" gombnyomás».
Minden eseménnyel gombnyomás» átadott tárgy « KeyPressEventArgs". Ez az objektum tartalmazza a "" tulajdonságot keychar” jelképezi a lenyomott billentyű karakterét. Például a SHIFT + D billentyűk lenyomásakor ez a tulajdonság a nagy D karaktert és a 68-as kódot adja vissza. kezelt', amely annak meghatározására szolgál, hogy az eseményt kezelték-e. Az érték beállításával " kezelt" ban ben " igaz", a bemeneti esemény nem kerül elküldésre operációs rendszer alapértelmezett feldolgozáshoz.
Nézzünk meg néhány példát az adatbeviteli korlátozások szövegmezőben történő létrehozására.
1. példa:
textBox1_KeyPress".

if ((e.KeyChar<= 47 || e.KeyChar >= 58) && e.KeyChar != 8) e.Handled = igaz; Ez a példa olyan összetett feltételeket tartalmaz, amelyek logikai operátorokat használnak, mint pl &&(és), || (vagy), ! (nem)és két feltétel szerint ellenőrzi a beírt karakter decimális kódját:

  • "e.KeyChar != 8" - Ha megnyomta a "Backspace" billentyűt, akkor engedélyezze a karakter törlését.
  • "(e. KeyChar<= 47 || e.KeyChar >= 58 )" - Ha a beírt karakter ASCII-kódja kisebb vagy egyenlő, mint 47, és nagyobb vagy egyenlő, mint 58, akkor a bevitel tilos.
Alább ASCII kódtábla, amelyben a karakterek piros színnel vannak kiemelve, amelyek bevitele tilos és zölddel, amelyek bevitele engedélyezett.

2. példa:
Adja hozzá a következő listát a " textBox1_KeyPress».
if (!Char.IsDigit(e.KeyChar) && e.KeyChar != Convert.ToChar(8)) (e.Handled = true; ) Ez a példa logikai operátorokat is használ, mint pl &&(és), ! (nem)és a beírt karakter decimális kódját két feltétel szerint ellenőrzi. A módszert az ellenőrzésre használják Char.IsDigit", ami visszaadja" igaz"", ha a beírt Unicode karakter egy decimális számjegy és " hamis", ha nem. Van egy csekk is a gomb megnyomására backspace».
3. példa:
if (!(Char.IsDigit(e.KeyChar)) && !((e.KeyChar == ".") && (((TextBox)sender).Text.IndexOf(".") == -1) && ( ((TextBox)sender).Text.Length != 0))) ( if (e.KeyChar != (char)Keys.Back) ( e.Handled = true; ) ) Ebben a példában és az előzőben is a bemeneti karakter kódját a " Char.IsDigit”, de van egy további feltétel, amely lehetővé teszi az egyik bevitelét tizedes elválasztó. Ehhez a módszert használják Text.IndexOf". Ez a módszer az aktuális kultúra felhasználásával szavakonként keres egy időszakot. A keresés ebben az esetben az első karakterpozícióval kezdődik (az aktuális sor), és az utolsó karakterpozícióig folytatódik. Ha a megadott szimbólum nem található, akkor a metódus a " -1 ". Ha a szimbólumot megtaláltuk, a metódus egy decimális egész számot ad vissza, amely jelzi az adott szimbólum pozícióját, és megtiltja a szimbólum bevitelének feldolgozását.

Tizedes elválasztó- a valós szám egész és tört részének elválasztására szolgáló jel tizedes tört formájában a tizedes rendszerben. Más számrendszerek törteire a szám egész számának és törtrészének elválasztója kifejezés használható. Néha a tizedespont és a tizedespont kifejezések is használhatók. (http://ru.wikipedia.org).
További információ a módszerről Text.IndexOf» a következő címen érhető el: http://msdn.microsoft.com.

4. példa:
Adja hozzá a következő listát a " textBox1_KeyPress».

if (!System.Text.RegularExpressions.Regex.Match(e.KeyChar.ToString(), @"").Siker) ( e.Handled = true; ) A beviteli karakterek ellenőrzéséhez ebben a példában a " Regex egyezések". Ez a metódus a bemeneti karakterláncban megkeresi az adott reguláris kifejezés minden előfordulását. A reguláris kifejezés egy karakterminta, amely tetszőleges hosszúságú karaktersorozatot reprezentál. Bármilyen reguláris kifejezést megadhat, például csak karaktereket engedélyezhet " "vagy engedélyezze a decimális elválasztó bevitelét" ,|.| ».
5. példa:
Adja hozzá a következő listát a " textBox1_KeyPress».

if (!System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(),@"\d+")) e.Handled = igaz; Ez a példa is a megadott reguláris kifejezést használja a beírt karakter érvényesítésének végrehajtására. A reguláris kifejezés a " + ”, ami azt jelenti, hogy egy vagy több azonos típusú karaktert kell találni. Például, \d+ egyezik az "1", "11", "1234" stb. számokkal. Ha nem biztos benne, milyen számok követik a számot? Megadhatja, hogy akár tetszőleges számú számjegy, akár semmilyen számjegy megengedett. Ehhez a " * ».
6. példa:
A példa megvalósításához a " eseményt kell használnia kulcs le", a vezérlőelem" szövegdoboz1". Lépjen a fő űrlapkonstruktorba, és válassza ki a "komponenst" szövegdoboz1". Kattintson a jobb gombbal erre a vezérlőre, és a megjelenő helyi menüből válassza ki a " Tulajdonságok". A megnyíló ablakban lépjen az összetevő eseményekre (a villám ikon az ablak tetején), és keresse meg az eseményt " kulcs le”, kattintson duplán erre az eseményre. Az összes lépés végrehajtása után az automatikusan generált metódusra lép. textBox1_KeyDown", fejlesztések" kulcs le". Ez az esemény minden alkalommal megtörténik, amikor egy billentyűt lenyomnak, miközben a vezérlő fókuszban van.

Billentyűzet beviteli események

Amikor a felhasználó megnyom egy billentyűt, események sorozata indul el. A táblázat felsorolja ezeket az eseményeket a bekövetkezésük sorrendjében:

Az események bekövetkezésének kronológiája
Név Útválasztás típusa Leírás
PreviewKeyDown alagútépítés Akkor fordul elő, amikor egy billentyűt lenyomnak.
kulcs le buborék terjed Azonos
PreviewTextInput alagútépítés Akkor fordul elő, amikor a billentyűleütés befejeződött, és az elem szövegbevitelt kap. Ez az esemény nem fordul elő olyan billentyűk esetében, amelyek nem "nyomtatnak" karaktereket (például nem akkor fordul elő, ha a billentyűket lenyomják , , , kurzorbillentyűk, funkcióbillentyűk stb.)
Szövegbevitel buborék terjed Azonos
PreviewKeyUp alagútépítés A kulcs elengedésekor következik be
kulcs fel buborék terjed Azonos

A billentyűzetes események kezelése korántsem olyan egyszerű, mint amilyennek látszik. Egyes vezérlők blokkolhatják ezeket az eseményeket annak érdekében, hogy saját billentyűzettel kezeljék őket. A legfigyelemreméltóbb példa a TextBox elem, amely blokkolja a TextInput eseményt, valamint a KeyDown eseményt bizonyos billentyűk, például kurzorbillentyűk lenyomására. Ilyen esetekben általában továbbra is használhat alagútba kapcsolt eseményeket (PreviewTextInput és PreviewKeyDown).

A TextBox elem hozzáad egy új eseményt, a TextChanged. Ez az esemény azonnal aktiválódik, miután egy billentyűleütés megváltoztatja a szöveget a szövegmezőben. Ezen a ponton azonban az új szöveg már látható a szövegmezőben, így már késő visszavonni a nem kívánt billentyűleütést.

Billentyűkezelés

A billentyűzetesemények működésének és használatának megértéséhez a legjobb egy példa segítségével. Az alábbiakban egy példaprogram látható, amely figyeli és naplózza az összes lehetséges billentyűleütést, miközben egy szövegmező fókuszban van. Ebben az esetben a nagy S betű beírásának eredménye látható.

Ez a példa egy fontos szempontot mutat be. A PreviewKeyDown és KeyDown események minden egyes billentyűlenyomáskor felfelé mutatnak. A TextInput esemény azonban csak akkor aktiválódik, ha egy karaktert „bevitelünk” az elembe. Valójában ez sok billentyű lenyomását jelentheti. A példában két billentyűt kell megnyomnia az eléréshez nagybetű S: kulcs előbb , majd a kulcsot . Ez két KeyDown és KeyUp eseményt eredményez, de csak egy TextInput eseményt.

Hagyja figyelmen kívül az ismételt karakterlenyomásokat

Nyilvános részleges osztály MainWindow: Window ( public MainWindow() ( InitializeComponent(); ) private void Clear_Click(object sender, RoutedEventArgs e) ( lbxEvents.Items.Clear(); txtContent.Clear(); i = 0; ) védett int = 0; private void KeyEvents(objektum küldője, KeyEventArgs e) ( if ((bool)chkIgnoreRepeat.IsChecked && e.IsRepeat) return; i++; string s = "Esemény" + i + ": " + e.RoutedEvent + " Kulcs : " + e.Key; lbxEvents.Items.Add(s); ) private void TextInputEvent(objektum feladó, TextCompositionEventArgs e) ( i++; string s = "Esemény" + i + ": " + e.RoutedEvent + " Kulcs: " + e.Text; lbxEvents.Items.Add(s); ) )

A PreviewKeyDown, KeyDown, PreviewKey és KeyUp események ugyanazt az információt adják át a KeyEventArgs objektumnak. A legfontosabb rész a Key tulajdonság, amely egy értéket ad vissza a System.Windows.Input.Key felsorolásból, és azonosítja a lenyomott vagy felengedett billentyűt.

A Kulcs érték nem veszi figyelembe a többi gomb állapotát – például azt, hogy a billentyűt lenyomták-e préseléskor ; mindkét esetben ugyanazt a kulcs (Key.S) értéket kapja.

Itt van egy nehézség. Attól függően, hogy a billentyűzet hogyan van beállítva a Windows rendszerben, egy billentyű lenyomva tartása azt eredményezi, hogy a billentyűt rövid idő elteltével ismét megnyomja. Például egy billentyű lenyomása egy sor S karaktert ír be a szövegmezőbe. Hasonlóképpen, ha megnyomja a gombot ismétlődő kattintásokat és KeyDown események sorozatát eredményezi. Valós példában egy kombináció megnyomásakor a szövegmező egy KeyDown eseménysorozatot generál a kulcshoz , majd a kulcs KeyDown eseményét , a TextInput esemény (vagy a TextChanged esemény abban az esetben szövegmező), majd a KeyUp eseményt a kulcsokhoz és . Ha figyelmen kívül szeretné hagyni a billentyűleütéseket , a KeyEventArgs.IsRepeat tulajdonság segítségével ellenőrizheti, hogy a lenyomás billentyűleütés eredménye-e.

A PreviewKeyDown, KeyDown, PreviewKey és KeyUp események alkalmasabbak alacsony szintű kódok írására a billentyűzet bevitelének kezelésére (amire ritkán van szükség, kivéve a felhasználói vezérlőknél) és speciális billentyűlenyomások kezelésére (például funkcióbillentyűk).

A KeyDown eseményt a PreviewTextInput esemény követi. (A TextInput esemény nem jelenik meg, mert a TextBox blokkolja.) Ezen a ponton a szöveg még nem jelenik meg a vezérlőben.

A TextInput esemény objektumkódot biztosít TextCompositionEventArgs. Ez az objektum tartalmaz egy Szöveg tulajdonságot, amely készen áll a renderelt szöveg átadására a vezérlőnek.

Ideális esetben a PreviewTextInput esemény használható olyan vezérlők ellenőrzésére, mint a TextBox. Például, ha olyan szövegmezőt hoz létre, amely csak számokat fogad el, ellenőrizheti, hogy az aktuális billentyűleütés beírt-e betűt, és beállíthatja a Kezelt jelzőt, ha igen. Sajnos a PreviewTextIlnput esemény nem jön létre egyes kezelendő kulcsokhoz. Például a szóköz billentyű lenyomása egy szövegmezőben teljesen kihagyja a PreviewTextInput eseményt. Ez azt jelenti, hogy a PreviewKeyDown eseményt is kezelnie kell.

Sajnos nehéz robusztus adatérvényesítési logikát megvalósítani a PreviewKeyDown eseménykezelőben, mint csak a Kulcs érték áll rendelkezésre, és ez túl alacsony szintű információ. Például a Key numeration különbséget tesz a numerikus billentyűzet billentyűi (csak számok bevitelére szolgáló blokk) és a hagyományos billentyűzet között. Ez azt jelenti, hogy attól függően, hogy hol van megnyomva a 9 billentyű, a Key.D9 vagy a Key.NumPad9 lesz. Az összes érvényes érték ellenőrzése legalábbis nagyon fárasztó.

Az egyik kiút az osztály használata KeyConverter, amely lehetővé teszi a Kulcs értékének hasznosabb karakterláncsá alakítását. Például egy függvényhívás KeyConverter.ConvertToString() a Key.D9 és Key.NumPad9 értékek bármelyikével a "9" karakterlánc eredményt adja vissza. A Key.ToString() konverzió meghívása kevésbé hasznos enumnevet eredményez ("D9" vagy "NumPad9"):

KeyConverter konverter = new KeyConverter(); string kulcs = converter.ConvertToString(e.Key);

A KeyConverter használata azonban szintén nem túl kényelmes, mivel hosszú sorokat kell kezelnie (például "Backspace") azoknál a billentyűleütéseknél, amelyek nem eredményeznek szövegbevitelt.

A legmegfelelőbb lehetőség a PreviewTextInput esemény (ahol az ellenőrzés nagy része megtörténik) a PreviewKeyDown eseménnyel együtt kezelése olyan billentyűleütések esetén, amelyek nem generálnak PreviewTextInput eseményt a szövegmezőben (például szóköz).



Támogasd a projektet – oszd meg a linket! Köszönjük!
Olvassa el is
kakasviadal játékszabályok kakasviadal játékszabályok Mod a minecraft 1.7-hez 10 nézhető recept.  Receptek tárgyak készítéséhez Minecraftban.  Fegyverek a Minecraftban Mod a minecraft 1.7-hez 10 nézhető recept. Receptek tárgyak készítéséhez Minecraftban. Fegyverek a Minecraftban Shilling és font – a szavak eredete Shilling és font – a szavak eredete