Cum de a face propriul dvs. compozit de control în winforms, notație

Sarcina: de a efectua un control non-standard pentru Windows Froms. Care dintre ele? Există mai multe opțiuni diferite, subiectul acestui articol va fi propriul dvs. DateTimePicker, capabil să lucreze cu date goale. Ca date goale, clasa DatePlus descrisă anterior va fi utilizată activ. Ce vrem? De fapt, avem nevoie de un Masked TextBox pentru introducerea unei date, un buton pentru a apela un calendar pop-up și o serie de funcții de serviciu - ambalate într-o singură coajă. În plus, butonul trebuie să aibă o săgeată care se rotește în sus sau în jos, în funcție de disponibilitatea calendarului.







Kind MSDN spune că managerii non-standard sunt de trei tipuri:

- compozite (compozite), care combină mai multe deja existente, sunt moștenite de la UserControl
- extins, adăugând ceva nou la controlul existent, se fac prin moștenire din clasa corespunzătoare
- Personalizat (personalizat), în care este redată ecranul

Evident, avem nevoie de un element compozit de control. Ultima parte a teoriei înainte de a trece la cod - din punctul de vedere al sistemului de operare, fiecare element Windows Forms este o fereastră separată. Asta este, avem o fereastră principală - o formă în interiorul căreia există ferestre mai mici, în interiorul cărora pot fi ferestre chiar mai mici (de exemplu grupul de grupuri și câteva butoane din interior).

În studio, putem adăuga simplu "User Control" la proiect și pentru a obține un designer foarte asemănător cu designerul formei obișnuite și arunca MaskedTextBox, buton și calendar pe ea. Făcând clic pe buton, calendarul ar trebui să apară și să dispară - acest lucru se poate realiza prin simpla schimbare a dimensiunii controlului.

Aici apare prima problemă - calendarul standard nu depășește forma parentală. Adică, dacă plasăm titularul remarcabil al datelor de lângă marginea inferioară sau dreaptă a formularului, calendarul va fi tăiat. Vreau ca el să meargă frumos în aerul virtual ca un meniu pop-up. Faceți clic pe butonul - apare, faceți clic pe buton sau în afara acestuia - dispare. Aici, în aceste clicuri câinele este îngropat.

În Stackoverflow, suntem sfătuiți să moștenim din elementul de bază al meniului pop-up ToolStripDropDown. Totul se ridică perfect, dar există multe probleme cu închiderea automată a meniului pop-up - este ascuns undeva foarte adânc în adâncurile sistemului. Trebuie să țineți evidența acesteia pentru a executa corect deschiderea și închiderea manuală făcând clic pe buton. Autoclosarea se comportă foarte ciudat și ilogic, ultimul paie pentru mine a fost faptul că apăsarea butonului apare mai devreme, apoi evenimentul efectiv de clic pe buton. Ca rezultat, am scuipat pe codul pervertit de eludare a tuturor acestor glitches și a atras designerului o miniformă cu un calendar interior, pe care deja îl arăt / închis făcând clic.

Cum de a face propriul dvs. compozit de control în winforms, notație






Dar unde este exact această formă care trebuie derivată? La urma urmei, nu știm locația managerului nostru în avans. Coordonatele pentru ieșirea formularului vor trebui recalculate din coordonatele relative din interiorul ferestrei părinte pentru control și înapoi.

Funcția de închidere automată este simulată foarte simplu - închidem apelul Ascundere apel la evenimentul Dezactivare

De asemenea, merită să ne amintim că în Calendarul calendaristic, în mod prestabilit, este selectat intervalul de date și avem nevoie doar de unul - la selectarea datei, intervalul trebuie distrus. Este mai convenabil să faceți acest lucru din cadrul formularului.

Excelent. Totul nu se ridică și iese, ci se deschide și se închide. Începem testarea cu diferite dimensiuni ale formularului și întâlnim o altă problemă interesantă - MaskedTextBox scară în mod disproporționat de conținutul său. Pur și simplu vorbind, atunci când măriți dimensiunea fontului, linia de conținut încetează să se încadreze în ea și este tăiată (cu siguranță puteți defila până la capăt cu cursorul). Acest glitch este de asemenea tratat într-un mod neașteptat - prin setarea unei culori de fundal transparente a containerului UserControl comun.

O altă problemă poate fi văzută chiar în designer - atunci când copiați un element prin Ctrl + glisarea containerului de bază al controlului nostru se va întinde. În plus, este dificil să se poziționeze în raport cu alte elemente. Trateazăm după cum urmează:

1. Zero în elementele interne ale marjei de proprietate Editați locația pentru a le pune aproape de granițe și apăsați UserControl

2. Puneți AutoScaleMode în față, AutoSize -> true, AutoSizeMode -> GrowAndShrink

Ultimul bug este legat de faptul că calendarul va fi într-o formă separată, iar mărimea fontului nu va fi transmisă, dimensiunea calendarului nu se va schimba după mărimea controlului și a formularului de bază. Nu putem specifica acest lucru în constructor, deoarece mărimea fontului va veni la managerul nostru mai târziu. Cel mai simplu lucru este să îl setați când calendarul este afișat pe ecran.

Ce a rămas pentru noi? Săgeată pe buton! Este necesar să modificați o imagine în timpul executării programului și cel mai simplu mod de a face acest lucru este adăugând ImageList controlului prin proiectant și încărcând imaginile în același loc. Codul pentru schimbare este trivial.

Cu cât mai multă libertate, cu atât mai multe probleme. Dacă utilizatorul introduce data cu textul, atunci îl poate introduce incorect! Și există o întrebare separată despre ce ar trebui să fie considerat corect - de exemplu, este posibil ca un utilizator să introducă o dată din viitor? Uneori uneori nu puteți. Prin urmare, este logic să introduceți un parametru separat pentru a ajusta intrarea de date din viitor și a afișa-o în panoul de proprietăți al designerului VisualStudio

Adăugați o funcție pentru a verifica data pentru corectitudine.

Și, în cele din urmă, gestionați corect data din calendar, luând în considerare faptul că intervalul de date al calendarului este, de asemenea, limitat și dacă data iese din calendar, atunci nu este necesar să îl puneți în calendar

Introducerea valorii greșite trebuie urmărită și împușcată pentru a convinge utilizatorul să nu facă astfel de mușcături. Trasarea relativ fiabilă a ieșirii utilizatorului din MaskedTextBox am reușit să obțin urmărirea evenimentelor Validate și MouseLeave. Acestea se întâmplă adesea în spatele celeilalte, astfel încât și vizibilitatea ferestrei cu mesajul de eroare trebuie să fie monitorizată, astfel încât fereastra să nu fie afișată de două ori.

Dacă este încă introdusă o linie greșită, decizia puternică are o dată goală.

Pentru a colecta totul împreună, voi obține proiectul de testare WinForms cu toate clasele de mai sus, colectate într-un DLL separat și un formular de testare

Cum de a face propriul dvs. compozit de control în winforms, notație







Articole similare

Trimiteți-le prietenilor: