Návod: Vytvoření složeného ovládacího prvku pomocí jazyka C#
Složené ovládací prvky poskytují prostředky, pomocí kterých je možné vytvářet a opakovaně používat vlastní grafická rozhraní. Složený ovládací prvek je v podstatě komponenta s vizuální reprezentací. Může se tak skládat z jednoho nebo více ovládacích prvků model Windows Forms, součástí nebo bloků kódu, které můžou rozšířit funkce ověřováním uživatelského vstupu, úpravou vlastností zobrazení nebo prováděním jiných úloh vyžadovaných autorem. Složené ovládací prvky lze umístit na model Windows Forms stejným způsobem jako jiné ovládací prvky. V první části tohoto návodu vytvoříte jednoduchý složený ovládací prvek s názvem ctlClock
. V druhé části návodu rozšíříte funkce ctlClock
prostřednictvím dědičnosti.
Vytvoření projektu
Při vytváření nového projektu zadáte jeho název pro nastavení kořenového oboru názvů, názvu sestavení a názvu projektu a ujistěte se, že výchozí komponenta bude ve správném oboru názvů.
Vytvoření knihovny ovládacích prvků ctlClockLib a ovládacího prvku ctlClock
V sadě Visual Studio vytvořte nový projekt knihovny ovládacích prvků model Windows Forms a pojmenujte ho ctlClockLib.
Název projektu ,
ctlClockLib
je také přiřazen ke kořenovému oboru názvů ve výchozím nastavení. Kořenový obor názvů slouží k určení názvů komponent v sestavení. Pokud například dvě sestavení poskytují součásti s názvemctlClock
, můžete určit komponentuctlClock
pomocíctlClockLib.ctlClock.
V Průzkumník řešení klepněte pravým tlačítkem myši UserControl1.cs a potom klepněte na tlačítko Přejmenovat. Změňte název souboru na
ctlClock.cs
. Po zobrazení výzvy, zda chcete přejmenovat všechny odkazy na element kódu UserControl1, klikněte na tlačítko Ano.Poznámka:
Složený ovládací prvek ve výchozím nastavení dědí z UserControl třídy poskytované systémem. Třída UserControl poskytuje funkce vyžadované všemi složenými ovládacími prvky a implementuje standardní metody a vlastnosti.
V nabídce Soubor klepněte na tlačítko Uložit vše uložit projekt.
Přidání ovládacích prvků a komponent systému Windows do složeného ovládacího prvku
Vizuální rozhraní je základní součástí složeného ovládacího prvku. Toto vizuální rozhraní je implementováno přidáním jednoho nebo více ovládacích prvků Windows na plochu návrháře. V následující ukázce začleníte ovládací prvky Windows do složeného ovládacího prvku a napíšete kód pro implementaci funkcí.
Přidání popisku a časovače do složeného ovládacího prvku
V Průzkumník řešení klepněte pravým tlačítkem myši ctlClock.cs a potom klepněte na tlačítko Návrhář zobrazení.
Na panelu nástrojů rozbalte uzel Společné ovládací prvky a poklikejte na Popisek.
Ovládací Label prvek s názvem
label1
se přidá do vašeho ovládacího prvku na ploše návrháře.V návrháři klikněte na popisek1. V okno Vlastnosti nastavte následující vlastnosti.
Vlastnost Změňte na Název lblDisplay
Text (blank space)
Textalign MiddleCenter
Font.Size 14
V sadě nástrojů rozbalte uzel Součásti a poklikejte na časovač.
Timer Vzhledem k tomu, že je součástí, nemá vizuální reprezentaci za běhu. Proto se nezobrazuje s ovládacími prvky na ploše návrháře, ale spíše v Návrháři komponent (zásobník v dolní části plochy návrháře).
V návrháři komponent klepněte na časovač1 a potom nastavte Interval vlastnost
1000
na a Enabled vlastnost natrue
.Vlastnost Interval řídí frekvenci, s jakou komponenta Timer zaškrtne. Pokaždé, když
timer1
zaškrtne, spustí kód vtimer1_Tick
události. Interval představuje počet milisekund mezi klíštětemi.V Návrháři komponent poklikáním časovače1přejděte na
timer1_Tick
událost proctlClock
.Upravte kód tak, aby připomínal následující vzorový kód. Nezapomeňte změnit modifikátor přístupu z
private
naprotected
.protected void timer1_Tick(object sender, System.EventArgs e) { // Causes the label to display the current time. lblDisplay.Text = DateTime.Now.ToLongTimeString(); }
Tento kód způsobí, že se aktuální čas zobrazí v
lblDisplay
. Vzhledem k tomu, že intervaltimer1
byl nastaven na1000
, dojde k této události každých tisíc milisekund, čímž se aktualizuje aktuální čas každou sekundu.Upravte metodu tak, aby byla přepsána klíčovým slovem
virtual
. Další informace najdete v části Dědění z uživatelského ovládacího prvku níže.protected virtual void timer1_Tick(object sender, System.EventArgs e)
V nabídce Soubor klepněte na tlačítko Uložit vše uložit projekt.
Přidání vlastností do složeného ovládacího prvku
Ovládací prvek hodiny teď zapouzdřuje Label ovládací prvek a komponentu Timer , z nichž každý má vlastní sadu vlastních vlastností. I když jednotlivé vlastnosti těchto ovládacích prvků nebudou přístupné pro další uživatele vašeho ovládacího prvku, můžete vytvořit a zveřejnit vlastní vlastnosti napsáním příslušných bloků kódu. V následujícím postupu přidáte do ovládacího prvku vlastnosti, které uživateli umožní změnit barvu pozadí a textu.
Přidání vlastnosti do složeného ovládacího prvku
V Průzkumník řešení klepněte pravým tlačítkem myši ctlClock.cs a potom klepněte na tlačítko Zobrazit kód.
Otevře se Editor kódu pro váš ovládací prvek.
public partial class ctlClock
Vyhledejte příkaz. Pod levou závorku ({)
zadejte následující kód.private Color colFColor; private Color colBColor;
Tyto příkazy vytvářejí privátní proměnné, které použijete k uložení hodnot vlastností, které se chystáte vytvořit.
Zadejte nebo vložte následující kód pod deklarace proměnných z kroku 2.
// Declares the name and type of the property. public Color ClockBackColor { // Retrieves the value of the private variable colBColor. get { return colBColor; } // Stores the selected value in the private variable colBColor, and // updates the background color of the label control lblDisplay. set { colBColor = value; lblDisplay.BackColor = colBColor; } } // Provides a similar set of instructions for the foreground color. public Color ClockForeColor { get { return colFColor; } set { colFColor = value; lblDisplay.ForeColor = colFColor; } }
Předchozí kód zpřístupňuje dvě vlastní vlastnosti
ClockForeColor
aClockBackColor
k dispozici pro další uživatele tohoto ovládacího prvku.set
Příkazyget
poskytují úložiště a načtení hodnoty vlastnosti a také kód pro implementaci funkčnosti odpovídající vlastnosti.V nabídce Soubor klepněte na tlačítko Uložit vše uložit projekt.
Otestování ovládacího prvku
Ovládací prvky nejsou samostatné aplikace; musí být hostované v kontejneru. Otestujte chování běhu ovládacího prvku a otestujte jeho vlastnosti pomocí kontejneru UserControl Test. Další informace naleznete v tématu Postupy: Otestování chování běhu userControl.
Otestování ovládacího prvku
Stisknutím klávesy F5 sestavte projekt a spusťte ovládací prvek v kontejneru Test UserControl.
V mřížce vlastností testovacího kontejneru vyhledejte
ClockBackColor
vlastnost a pak vyberte vlastnost, která zobrazí paletu barev.Vyberte barvu tak, že na ni kliknete.
Barva pozadí ovládacího prvku se změní na barvu, kterou jste vybrali.
Pomocí podobné posloupnosti událostí ověřte, že
ClockForeColor
vlastnost funguje podle očekávání.V této části a předchozích částech jste viděli, jak lze komponenty a ovládací prvky Systému Windows kombinovat s kódem a balením a poskytovat tak vlastní funkce ve formě složeného ovládacího prvku. Naučili jste se vystavit vlastnosti ve složeného ovládacího prvku a jak otestovat ovládací prvek po jeho dokončení. V další části se dozvíte, jak vytvořit zděděný složený ovládací prvek jako
ctlClock
základ.
Dědění ze složeného ovládacího prvku
V předchozích částech jste se naučili kombinovat ovládací prvky, komponenty a kód Windows do opakovaně použitelných složených ovládacích prvků. Složený ovládací prvek se teď dá použít jako základ, na kterém se dají sestavit další ovládací prvky. Proces odvození třídy ze základní třídy se nazývá dědičnost. V této části vytvoříte složený ovládací prvek s názvem ctlAlarmClock
. Tento ovládací prvek bude odvozen z nadřazeného ovládacího prvku, ctlClock
. Naučíte se rozšířit funkce ctlClock
přepsáním nadřazených metod a přidáním nových metod a vlastností.
Prvním krokem při vytváření zděděného ovládacího prvku je jeho odvození z nadřazeného prvku. Tato akce vytvoří nový ovládací prvek, který má všechny vlastnosti, metody a grafické charakteristiky nadřazeného ovládacího prvku, ale může také fungovat jako základ pro přidání nových nebo upravených funkcí.
Vytvoření zděděného ovládacího prvku
V Průzkumník řešení klepněte pravým tlačítkem myši ctlClockLib, přejděte na příkaz Přidat a klepněte na tlačítko Uživatelský ovládací prvek.
Otevře se dialogové okno Přidat novou položku .
Vyberte šablonu zděděného uživatelského ovládacího prvku.
Do pole Název zadejte
ctlAlarmClock.cs
a klepněte na tlačítko Přidat.Zobrazí se dialogové okno Pro výběr dědičnosti.
V části Název součásti poklikejte na ctlClock.
V Průzkumník řešení procházejte aktuální projekty.
Poznámka:
Do aktuálního projektu byl přidán soubor ctlAlarmClock.cs .
Přidání vlastností alarmu
Vlastnosti se přidají do zděděného ovládacího prvku stejným způsobem, jakým se přidají do složeného ovládacího prvku. Teď použijete syntaxi deklarace vlastnosti k přidání dvou vlastností do ovládacího prvku: AlarmTime
, který uloží hodnotu data a času, kdy se alarm má vypnout, a AlarmSet
, což bude indikovat, zda je alarm nastaven.
Přidání vlastností do složeného ovládacího prvku
V Průzkumník řešení klepněte pravým tlačítkem myši ctlAlarmClock a potom klepněte na tlačítko Zobrazit kód.
public class
Vyhledejte příkaz. Všimněte si, že váš ovládací prvek dědí zctlClockLib.ctlClock
. Pod levou složenou závorkou ({)
příkaz zadejte následující kód.private DateTime dteAlarmTime; private bool blnAlarmSet; // These properties will be declared as public to allow future // developers to access them. public DateTime AlarmTime { get { return dteAlarmTime; } set { dteAlarmTime = value; } } public bool AlarmSet { get { return blnAlarmSet; } set { blnAlarmSet = value; } }
Přidání do grafického rozhraní ovládacího prvku
Zděděný ovládací prvek má vizuální rozhraní, které je stejné jako ovládací prvek, ze kterého dědí. Má stejné základní ovládací prvky jako nadřazený ovládací prvek, ale vlastnosti základních ovládacích prvků nebudou k dispozici, pokud nebyly výslovně vystaveny. Do grafického rozhraní zděděného složeného ovládacího prvku můžete přidat stejným způsobem jako do složeného ovládacího prvku. Pokud chcete pokračovat v přidávání do vizuálního rozhraní budíků, přidáte ovládací prvek popisku, který bude blikat, když budík zní.
Přidání ovládacího prvku popisku
V Průzkumník řešení klepněte pravým tlačítkem myši ctlAlarmClock a potom klepněte na tlačítko Návrhář zobrazení.
Návrhář pro
ctlAlarmClock
otevře v hlavním okně.Klikněte na zobrazenou část ovládacího prvku a zobrazte okno Vlastnosti.
Poznámka:
Zatímco jsou zobrazeny všechny vlastnosti, jsou neaktivní. To znamená, že tyto vlastnosti jsou nativní pro
lblDisplay
a nelze je upravovat ani přistupovat v okno Vlastnosti. Ve výchozím nastavení jsou ovládací prvky obsažené ve složeného ovládacího prvkuprivate
a jejich vlastnosti nejsou přístupné žádným způsobem.Poznámka:
Pokud chcete, aby další uživatelé složeného ovládacího prvku měli přístup k jeho interním ovládacím prvkům, deklarujte je jako
public
neboprotected
. To vám umožní nastavit a upravit vlastnosti ovládacích prvků obsažených ve složeného ovládacího prvku pomocí příslušného kódu.Label Přidejte ovládací prvek do složeného ovládacího prvku.
Pomocí myši přetáhněte Label ovládací prvek bezprostředně pod pole zobrazení. V okno Vlastnosti nastavte následující vlastnosti.
Vlastnost Nastavení Název lblAlarm
Text Alarm! Textalign MiddleCenter
Visible false
Přidání funkce alarmu
V předchozích postupech jste přidali vlastnosti a ovládací prvek, který ve složeném ovládacím prvku umožní funkci alarmů. V tomto postupu přidáte kód, který porovná aktuální čas s časem alarmu a pokud jsou stejné, aby blikal alarm. Přepsáním timer1_Tick
metody a přidáním dalšího ctlClock
kódu do ní rozšíříte schopnost ctlAlarmClock
při zachování všech vlastních funkcí ctlClock
.
Přepsání metody timer1_Tick ctlClock
V Editoru kódu vyhledejte
private bool blnAlarmSet;
příkaz. Přímo pod něj přidejte následující příkaz.private bool blnColorTicker;
V Editoru kódu vyhledejte pravou složenou závorku (
})
na konci třídy. Těsně před závorku přidejte následující kód.protected override void timer1_Tick(object sender, System.EventArgs e) { // Calls the Timer1_Tick method of ctlClock. base.timer1_Tick(sender, e); // Checks to see if the alarm is set. if (AlarmSet == false) return; else // If the date, hour, and minute of the alarm time are the same as // the current time, flash an alarm. { if (AlarmTime.Date == DateTime.Now.Date && AlarmTime.Hour == DateTime.Now.Hour && AlarmTime.Minute == DateTime.Now.Minute) { // Sets lblAlarmVisible to true, and changes the background color based on // the value of blnColorTicker. The background color of the label // will flash once per tick of the clock. lblAlarm.Visible = true; if (blnColorTicker == false) { lblAlarm.BackColor = Color.Red; blnColorTicker = true; } else { lblAlarm.BackColor = Color.Blue; blnColorTicker = false; } } else { // Once the alarm has sounded for a minute, the label is made // invisible again. lblAlarm.Visible = false; } } }
Přidání tohoto kódu provádí několik úloh. Příkaz
override
směruje ovládací prvek použít tuto metodu místo metody, která byla zděděna ze základního ovládacího prvku. Při volání této metody volá metodu, kterou přepíše vyvolánímbase.timer1_Tick
příkazu, čímž se zajistí, že se v tomto ovládacím prvku reprodukují všechny funkce zahrnuté do původního ovládacího prvku. Potom spustí další kód pro začlenění funkce alarmu. Když dojde k alarmu, zobrazí se ovládací prvek blikajícího popisku.Ovládání budíku je téměř hotové. Jedinou věcí, která zůstává, je implementovat způsob, jak ho vypnout. Uděláte to tak, že do
lblAlarm_Click
metody přidáte kód.
Implementace metody vypnutí
V Průzkumník řešení klepněte pravým tlačítkem myši ctlAlarmClock.cs a potom klepněte na tlačítko Návrhář zobrazení.
Otevře se návrhář.
Přidejte do ovládacího prvku tlačítko. Vlastnosti tlačítka nastavte následujícím způsobem.
Vlastnost Hodnota Název btnAlarmOff
Text Zakázat alarm V návrháři poklikejte na btnAlarmOff.
Editor kódu se otevře na
private void btnAlarmOff_Click
řádku.Upravte tuto metodu tak, aby připomínala následující kód.
private void btnAlarmOff_Click(object sender, System.EventArgs e) { // Turns off the alarm. AlarmSet = false; // Hides the flashing label. lblAlarm.Visible = false; }
V nabídce Soubor klepněte na tlačítko Uložit vše uložit projekt.
Použití zděděného ovládacího prvku ve formuláři
Zděděný ovládací prvek můžete otestovat stejným způsobem, jakým jste otestovali ovládací prvek základní třídy: ctlClock
Stisknutím klávesy F5 sestavíte projekt a spustíte ovládací prvek v kontejneru UserControl Test. Další informace naleznete v tématu Postupy: Otestování chování běhu userControl.
Pokud chcete ovládací prvek použít, budete ho muset hostovat ve formuláři. Stejně jako u standardního složeného ovládacího prvku nemůže zděděný složený ovládací prvek stát sám a musí být hostován ve formuláři nebo jiném kontejneru. Vzhledem k tomu ctlAlarmClock
, že má větší hloubku funkčnosti, je k otestování potřeba další kód. V tomto postupu napíšete jednoduchý program k otestování funkčnosti ctlAlarmClock
. Napíšete kód pro nastavení a zobrazení AlarmTime
vlastnosti ctlAlarmClock
a otestujete jeho vlastní funkce.
Sestavení a přidání ovládacího prvku do testovacího formuláře
V Průzkumník řešení klepněte pravým tlačítkem myši ctlClockLib a potom klepněte na příkaz Sestavit.
Přidejte do řešení nový projekt aplikace model Windows Forms a pojmenujte ho Test.
V Průzkumník řešení klikněte pravým tlačítkem myši na uzel Reference pro váš testovací projekt. Kliknutím na Přidat odkaz zobrazíte dialogové okno Přidat odkaz . Klikněte na kartu s popiskem Projekty. Váš
ctlClockLib
projekt bude uvedený v části Název projektu. Poklikáním na projekt přidejte odkaz na testovací projekt.V Průzkumník řešení klepněte pravým tlačítkem myši na test a potom klepněte na příkaz Sestavit.
V sadě nástrojů rozbalte uzel ctlClockLib Components .
Poklikáním na ctlAlarmClock přidáte kopii
ctlAlarmClock
formuláře.Na panelu nástrojů vyhledejte a poklikejte na DateTimePicker a přidejte DateTimePicker ovládací prvek do formuláře a potom Label přidejte ovládací prvek poklikáním na Popisek.
Pomocí myši umístěte ovládací prvky na vhodné místo ve formuláři.
Vlastnosti těchto ovládacích prvků nastavte následujícím způsobem.
Control Vlastnost Hodnota label1
Text (blank space)
Název lblTest
dateTimePicker1
Název dtpTest
Formát Time V návrháři poklikejte na dtpTest.
Otevře se Editor
private void dtpTest_ValueChanged
kódu .Upravte kód tak, aby vypadal následovně.
private void dtpTest_ValueChanged(object sender, System.EventArgs e) { ctlAlarmClock1.AlarmTime = dtpTest.Value; ctlAlarmClock1.AlarmSet = true; lblTest.Text = "Alarm Time is " + ctlAlarmClock1.AlarmTime.ToShortTimeString(); }
V Průzkumník řešení klepněte pravým tlačítkem myši na test a potom klepněte na tlačítko Nastavit jako spustit projekt.
V nabídce Ladit klikněte na Spustit ladění.
Spustí se testovací program. Všimněte si, že aktuální čas je v ovládacím
ctlAlarmClock
prvku aktualizován a že se v ovládacím DateTimePicker prvku zobrazuje počáteční čas.Klikněte na DateTimePicker místo, kde se zobrazí minuty hodiny.
Pomocí klávesnice nastavte hodnotu pro minuty, které jsou o jednu minutu větší než aktuální čas zobrazený .
ctlAlarmClock
Čas nastavení alarmu se zobrazí v
lblTest
. Počkejte, než se zobrazený čas dostane k času nastavení alarmu. Když zobrazený čas dosáhne času, kdy je alarm nastaven,lblAlarm
bude blikat.Vypněte alarm kliknutím
btnAlarmOff
. Možná teď resetujete alarm.
Tento článek se zabývá řadou klíčových konceptů. Naučili jste se vytvořit složený ovládací prvek kombinováním ovládacích prvků a komponent do kontejneru složených ovládacích prvků. Naučili jste se přidávat vlastnosti do ovládacího prvku a psát kód pro implementaci vlastních funkcí. V poslední části jste se naučili rozšířit funkce daného složeného ovládacího prvku prostřednictvím dědičnosti a změnit funkčnost hostitelských metod přepsáním těchto metod.
Viz také
.NET Desktop feedback
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro