17. diel - Vlastné ovládacie prvky v C # .NET
V predchádzajúcich 4 lekciách sme pracovali so základnými ovládacími prvkami, ktoré ponúka sám .NET Framework. Toto počínanie sme dovŕšili lekcií Ovládacie prvky Windows Forms štvrtýkrát . Asi však uznáte, že nie sú všemocné a skrátka a dobre nestačí na všetko. Dnes sa v C# tutoriálu pozrieme na tvorbu vlastných ovládacích prvkov.
Predstavme si, že potrebujeme urobiť progressbar, ktorý sa bude načítať odzadu. Výsledok bude vyzerať asi nejako takto:
ProgresBar
bude teda celkom obyčajný, len sa bude načítať
sprava doľava.
Pridanie prvku do projektu
V Solution Exploreri klikneme pravým tlačidlom myši na projekt a zvolíme
Add New Item. V dialógu Add New Item vyberieme šablónu User Control,
ovládací prvok pomenujeme MujProgressBar.cs
.
Otvorí sa nám návrhár ovládacieho prvku. Do prvku vložíme
PictureBox
. Celému prvku nastavíme v okne Properties vlastnosti
Width
na 200
a Height
na 25
.
PicureBox
u ďalej nastavíme Location
na
0;0
, Width
na 200
, Height
na
25
a Anchor
na Top
, Left
,
Bottom
a Right
, teda všetky strany. Týmto zaistíme,
že ovládací prvok bude mať rozmery 200 × 25 a pri zväčšení sa rozšíri
aj PictureBox
, na ktorý budeme neskôr postup vykresľovať.
V Solution Exploreri klikneme na MujOvladaciPrvek.cs
, a potom na
Show Code. Pridáme vlastnosti MaxValue
a Value
typu
int
. Ďalej ešte vytvoríme privátne atribút
MinValue
, ktorému nastavíme hodnotu 0
. V Setter
vlastností zavoláme ProgressBar_Paint()
, ako prvý a druhý
parameter odovzdáme null
. Táto metóda zatiaľ neexistuje,
neskôr ju pridáme.
private int _value = 0; public int Value { get { return _value; } set { _value = value; ProgressBar_Paint(null, null); } } private int minValue = 0; private int _maxValue = 100; public int maxValue { get { return _maxValue; } set { _maxValue = value; ProgressBar_Paint(null, null); } }
Ďalej pridáme metódy Increment()
a Decrement()
,
bez parametrov. Tieto metódy i preťažíme, aby prijímali jeden parameter -
Value
. V týchto metódach budeme inkrementovať (či
dekrementovat) hodnotu lište. Kód metód bude nasledujúce:
public void Increment(int Value) { if (this.Value + Value > maxValue) throw new ArgumentOutOfRangeException("Hodnota překročila maximum"); this.Value += Value; } public void Increment() { if (this.Value + 1 > maxValue) throw new ArgumentOutOfRangeException("Hodnota překročila maximum"); this.Value += Value; } public void Decrement(int Value) { if (this.Value - Value < minValue) throw new ArgumentOutOfRangeException("Hodnota klesla pod minimum"); this.Value -= Value; } public void Decrement() { if (this.Value - 1 < minValue) throw new ArgumentOutOfRangeException("Hodnota klesla pod minimum"); this.Value -= 1; }
V každej z metód overujeme, či hodnota nepresiahla maximum alebo minimum.
Ak áno, vyvoláme výnimku ArgumentOutOfRangeException
. Ak nová
hodnota bude validný, tak ju pripočítame alebo odčítame.
Teraz ešte musím progressbar prekresliť, presunieme sa do okna návrhára.
V okne Properties sa presunieme na udalosti a na udalosti Paint
priradíme obslužnú metódu ProgressBar_Paint()
. Presunieme sa do
editora kódu a do obsluhy ProgressBar_Paint()
pridáme
nasledujúci kód:
Graphics g = pictureBox1.CreateGraphics(); double vykreslovanaDelka = (double)this.Value * 100.0 / (double)maxValue / 100.0 * (double)this.Width; g.Clear(Color.Green); g.FillRectangle(Brushes.White, new Rectangle(0, 0, this.Width - int.Parse(vykreslovanaDelka.ToString()), 25));
Na prvom riadku deklarujeme grafiku PictureBox
u, na ktorú
budeme vykresľovať. Potom vypočítame pomocou jednoduchej trojčlenka
veľkosť (v px), ktorú musíme vykresliť, a potom ju vykreslíme od
konca.
Teraz sa presuňme do formulára. Nadol na formulár pridáme 2 tlačidlá a
jeden NumericUpDown
. Tlačidlám dodáme text +
a
-
, numericUpDown
meniť nebudeme.
Implementácia prvku
Z Toolbox
Všimnite si, že v okne Toolbox pribudla nová skupina
<nazev projektu> Components
. V tejto skupine sa nachádza
pointer, ktorý sa automaticky pridáva do každej skupiny a náš progressbar.
S týmto progressbar môžeme teraz zaobchádzať ako s každým iným
ovládacím prvkom. Pretiahnite si nový progressbar do formulára. Teraz sa v
našom formulári nachádza nový ovládací prvok.
Z kódu
Presuňme sa do kódu a vo formulári si vytvorme privátne atribút
prog
typu MujProgressBar
a hneď ho inicializujeme. V
konstruktoru mu nastavíme Location
na 12;43
a
pridáme ho do formulára.
MujProgressBar prog = new MujProgressBar(); public Form1() { InitializeComponent(); prog.Location = new Point(12, 43); Controls.Add(prog); }
Ešte pridáme obsluhy udalosti pre obe tlačidlá, ktoré nám budú inkrementovať a dekrementovat progressbar.
private void button1_Click(object sender, EventArgs e) { try { if (numericUpDown1.Value > 1) { prog.Increment(int.Parse(numericUpDown1.Value.ToString())); mujProgressBar1.Increment(int.Parse(numericUpDown1.Value.ToString())); } else { prog.Increment(); mujProgressBar1.Increment(); } } catch (ArgumentOutOfRangeException ex) { MessageBox.Show(ex.Message); } } private void button2_Click(object sender, EventArgs e) { try { if (numericUpDown1.Value > 1) { prog.Decrement(int.Parse(numericUpDown1.Value.ToString())); mujProgressBar1.Decrement(int.Parse(numericUpDown1.Value.ToString())); } else { prog.Decrement(); mujProgressBar1.Decrement(); } } catch (ArgumentOutOfRangeException ex) { MessageBox.Show(ex.Message); } }
Program si vyskúšajte, že funguje a progressbar sa naozaj načítava odzadu.
Vlastné užívateľské prvky sa hodí pre špecifické veci, vytvárať si
vlastné TextBox
je asi nezmysel. Bolo by to to isté ako vynájsť
znovu koleso. Ale ak naozaj potrebujete nejaký prvok pre špecifický účel,
je to určite správna voľba.
V tejto lekcii ste sa naučili vytvárať vlastné ovládacie prvky a naučili ste sa ich implementovať do programu. Tiež ste tým zavŕšili kurz WinForms a môžete pokračovať ďalšími kurzy v predmete C# .NET.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 461x (92.41 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#