Lekce 18 - Vlastní ovládací prvky v C# .NET
V minulé lekci, Tvoříme vlastní Syntax Highlighter pomocí RichTextBox v C#, jsme si vytvořili vlastní syntax highlighter.
Asi však uznáte, že nejsou všemocné a zkrátka a dobře nestačí na všechno. Dnes se v C# tutoriálu podíváme na tvorbu vlastních ovládacích prvků.
Představme si, že potřebujeme udělat progressbar, který se bude načítat odzadu. Výsledek bude vypadat asi nějak takto:

ProgresBar
bude tedy celkem obyčejný, jen se bude načítat
zprava doleva.
Přidání prvku do projektu
V Solution Exploreru klikneme pravým tlačítkem myši na projekt a zvolíme
Add New Item. V dialogu Add New Item vybereme šablonu User Control, ovládací
prvek pojmenujeme MujProgressBar.cs
.

Otevře se nám návrhář ovládacího prvku. Do prvku vložíme
PictureBox
. Celému prvku nastavíme v okně Properties vlastnosti
Width
na 200
a Height
na 25
.
PicureBox
u dále nastavíme Location
na
0;0
, Width
na 200
, Height
na
25
a Anchor
na Top
, Left
,
Bottom
a Right
, tedy všechny strany. Tímto
zajistíme, že ovládací prvek bude mít rozměry 200×25 a při zvětšení
se rozšíří i PictureBox
, na který budeme později postup
vykreslovat.
V Solution Exploreru klikneme na MujOvladaciPrvek.cs
, a poté na
Show Code. Přidáme vlastnosti MaxValue
a Value
typu
int
. Dále ještě vytvoříme privátní atribut
MinValue
, kterému nastavíme hodnotu 0
. V setteru
vlastností zavoláme ProgressBar_Paint()
, jako první a druhý
parametr předáme null
. Tato metoda zatím neexistuje, později ji
přidá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); } }
Dále přidáme metody Increment()
a Decrement()
,
bez parametrů. Tyto metody i přetížíme, aby přijímaly jeden parametr -
Value
. V těchto metodách budeme inkrementovat (či dekrementovat)
hodnotu progressbaru. Kód metod bude následující:
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ždé z metod ověřujeme, jestli hodnota nepřesáhla maximum nebo
minimum. Pokud ano, vyvoláme výjimku ArgumentOutOfRangeException
.
Pokud nová hodnota bude validní, tak ji přičteme nebo odečteme.
Nyní ještě musím progressbar překreslit, přesuneme se do okna
návrháře. V okně Properties se přesuneme na události a k události
Paint
přiřadíme obslužnou metodu
ProgressBar_Paint()
. Přesuneme se do editoru kódu a do obsluhy
ProgressBar_Paint()
přidáme následující 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 prvním řádku deklarujeme grafiku PictureBox
u, na kterou
budeme vykreslovat. Poté vypočítáme pomocí jednoduché trojčlenky velikost
(v px), kterou musíme vykreslit, a pak ji vykreslíme od konce.
Nyní se přesuňme do formuláře. Dolů na formulář přidáme 2
tlačítka a jeden NumericUpDown
. Tlačítkům dodáme text
+
a -
, numericUpDown
měnit nebudeme.

Implementace prvku
Z Toolboxu
Všimněte si, že v okně Toolboxu přibyla nová skupina
<nazev projektu> Components
. V této skupině se nachází
pointer, který se automaticky přidává do každé skupiny a náš
progressbar. S tímto progressbarem můžeme nyní zacházet jako s každým
jiným ovládacím prvkem. Přetáhněme si nový progressBar do formuláře.
Nyní se v našem formuláři nachází nový ovládací prvek.
Z kódu
Přesuňme se do kódu a ve formuláři si vytvořme privátní atribut
prog
typu MujProgressBar
a hned jej inicializujeme. V
konstruktoru mu nastavíme Location
na 12;43
a
přidáme jej do formuláře.
MujProgressBar prog = new MujProgressBar(); public Form1() { InitializeComponent(); prog.Location = new Point(12, 43); Controls.Add(prog); }
Ještě přidáme obsluhy události pro obě tlačítka, která nám budou inkrementovat 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 vyzkoušejte, že funguje a progressbar se opravdu načítá odzadu.
Vlastní uživatelské prvky se hodí pro specifické věci, vytvářet si
vlastní TextBox
je asi nesmysl. Bylo by to to samé jako
vynalézat znovu kolo. Ale pokud opravdu potřebujete nějaký prvek pro
specifický účel, je to určitě správná volba.
V této lekci jste se naučili vytvářet vlastní ovládací prvky a naučili jste se je implementovat do programu. Také jste tím završili kurz Winforms a můžete pokračovat dalšími kurzy v předmětu C# .NET.
V následujícím kvízu, Kvíz - Windows Forms v C# .NET, si vyzkoušíme nabyté zkušenosti z kurzu.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 468x (92.41 kB)
Aplikace je včetně zdrojových kódů v jazyce C#