Dela via


Genomgång: Skapa en sammansatt kontroll med C#

Sammansatta kontroller ger ett sätt att skapa och återanvända anpassade grafiska gränssnitt. En sammansatt kontroll är i huvudsak en komponent med en visuell representation. Därför kan den bestå av en eller flera Windows Forms-kontroller, komponenter eller kodblock som kan utöka funktionaliteten genom att verifiera användarindata, ändra visningsegenskaper eller utföra andra uppgifter som krävs av författaren. Sammansatta kontroller kan placeras i Windows Forms på samma sätt som andra kontroller. I den första delen av den här genomgången skapar du en enkel sammansatt kontroll med namnet ctlClock. I den andra delen av genomgången utökar du funktionerna i ctlClock genom arv.

Skapa projektet

När du skapar ett nytt projekt anger du dess namn för att ange rotnamnområdet, sammansättningsnamnet och projektnamnet och se till att standardkomponenten finns i rätt namnområde.

Skapa kontrollbiblioteket ctlClockLib och ctlClock-kontrollen

  1. I Visual Studio skapar du ett nytt Windows Forms Control Library-projekt och ger det namnet ctlClockLib.

    Projektnamnet, ctlClockLib, tilldelas också till rotnamnområdet som standard. Rotnamnområdet används för att kvalificera namnen på komponenterna i sammansättningen. Om två sammansättningar till exempel tillhandahåller komponenter med namnet ctlClockkan du ange din ctlClock komponent med hjälp av ctlClockLib.ctlClock.

  2. I Solution Explorerhögerklickar du på UserControl1.csoch klickar sedan på Byt namn på. Ändra filnamnet till ctlClock.cs. Klicka på knappen Ja när du tillfrågas om du vill byta namn på alla referenser till kodelementet "UserControl1".

    Anteckning

    Som standard ärver en sammansatt kontroll från den UserControl-klass som tillhandahålls av systemet. Klassen UserControl tillhandahåller funktioner som krävs av alla sammansatta kontroller och implementerar standardmetoder och egenskaper.

  3. På menyn Arkiv klickar du på Spara alla för att spara projektet.

Lägg till Windows-kontroller och -komponenter i den sammansatta kontrollen

Ett visuellt gränssnitt är en viktig del av din sammansatta kontroll. Det här visuella gränssnittet implementeras genom att en eller flera Windows-kontroller läggs till på designerytan. I följande demonstration kommer du att införliva Windows-kontroller i din sammansatta kontroll och skriva kod för att implementera funktioner.

Så här lägger du till en etikett och en timer i den sammansatta kontrollen

  1. I Solution Explorerhögerklickar du på ctlClock.csoch klickar sedan på Visa designer.

  2. I Toolboxska du expandera noden Vanliga Kontroller och sedan dubbelklicka på Label.

    En Label kontroll med namnet label1 läggs till i din kontroll på designerytan.

  3. I designern klickar du på etikett1. I fönstret Egenskaper anger du följande egenskaper.

    Egenskap Ändra till
    namn lblDisplay
    Text (blank space)
    TextAlign MiddleCenter
    Teckensnitt.Storlek 14
  4. I Toolbox-expanderar du noden Components och dubbelklickar sedan på Timer.

    Eftersom en Timer är en komponent har den ingen visuell representation vid körning. Därför visas den inte med kontrollerna på designerytan, utan i stället i Component Designer- (ett fack längst ned på designerytan).

  5. I Component Designerklickar du på timer1och anger sedan egenskapen Interval till 1000 och egenskapen Enabled till true.

    Egenskapen Interval styr med vilken frekvens Timer komponenten tickar. Varje gång timer1 tickar körs koden i händelsen timer1_Tick. Intervallet representerar antalet millisekunder mellan fästingar.

  6. I Component Designerdubbelklickar du på timer1 för att gå till händelsen timer1_Tick för ctlClock.

  7. Ändra koden så att den liknar följande kodexempel. Se till att ändra åtkomstmodifieraren från private till protected.

    protected void timer1_Tick(object sender, System.EventArgs e)
    {
        // Causes the label to display the current time.
        lblDisplay.Text = DateTime.Now.ToLongTimeString();
    }
    

    Den här koden gör att den aktuella tiden visas i lblDisplay. Eftersom intervallet för timer1 har angetts till 1000inträffar den här händelsen varje tusen millisekunder, vilket uppdaterar den aktuella tiden varje sekund.

  8. Ändra metoden så att den kan åsidosättas med nyckelordet virtual. Mer information finns i avsnittet "Ärver från en användarkontroll" nedan.

    protected virtual void timer1_Tick(object sender, System.EventArgs e)
    
  9. På menyn Arkiv klickar du på Spara alla för att spara projektet.

Lägg till egenskaper i den sammansatta kontrollen

Klockkontrollen kapslar nu in en Label kontroll och en Timer komponent, var och en med sina egna egenskaper. Även om de enskilda egenskaperna för dessa kontroller inte är tillgängliga för efterföljande användare av din kontroll, kan du skapa och exponera anpassade egenskaper genom att skriva lämpliga kodblock. I följande procedur lägger du till egenskaper i kontrollen som gör att användaren kan ändra bakgrundsfärgen och texten.

Så här lägger du till en egenskap i den sammansatta kontrollen

  1. I Solution Explorerhögerklickar du på ctlClock.csoch klickar sedan på Visa kod.

    Code Editor för den funktion du kontrollerar öppnas.

  2. Lokalisera public partial class ctlClock-instruktionen. Under den inledande klammerparentesen ({), skriver du följande kod.

    private Color colFColor;
    private Color colBColor;
    

    Dessa instruktioner skapar de privata variabler som du ska använda för att lagra värdena för de egenskaper som du ska skapa.

  3. Ange eller klistra in följande kod under variabeldeklarationerna från steg 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;
        }
    }
    

    Föregående kod gör två anpassade egenskaper, ClockForeColor och ClockBackColor, tillgängliga för efterföljande användare av den här kontrollen. get- och set-uttrycken tillhandahåller lagring och hämtning av egenskapsvärdet samt kod för att implementera funktioner som är lämpliga för egenskapen.

  4. På menyn Arkiv klickar du på Spara allt för att spara projektet.

Testa kontrollen

Kontroller är inte fristående program. de måste finnas i en container. Testa kontrollens beteende vid körning och utforska dess egenskaper med UserControl Testcontainer. Mer information finns i Så här testar du Run-Time beteendet hos en användarkontroll.

Testa din kontroll

  1. Tryck på F5 för att skapa projektet och kör kontrollen i UserControl-testcontainern.

  2. Leta upp egenskapen ClockBackColor i testcontainerns egenskapsrutnät och välj sedan egenskapen för att visa färgpaletten.

  3. Välj en färg genom att klicka på den.

    Bakgrundsfärgen för kontrollen ändras till den färg som du har valt.

  4. Använd en liknande sekvens med händelser för att verifiera att egenskapen ClockForeColor fungerar som förväntat.

    I det här avsnittet och föregående avsnitt har du sett hur komponenter och Windows-kontroller kan kombineras med kod och paketering för att tillhandahålla anpassade funktioner i form av en sammansatt kontroll. Du har lärt dig att exponera egenskaper i din sammansatta kontroll och hur du testar din kontroll när den är klar. I nästa avsnitt får du lära dig hur du skapar en ärvd sammansatt kontroll med hjälp av ctlClock som bas.

Ärva från en sammansatt styrkomponent

I föregående avsnitt har du lärt dig hur du kombinerar Windows-kontroller, komponenter och kod till återanvändbara sammansatta kontroller. Din sammansatta kontroll kan nu användas som en bas där andra kontroller kan skapas. Processen för att härleda en klass från en basklass kallas arv. I det här avsnittet skapar du en sammansatt kontroll med namnet ctlAlarmClock. Den här kontrollen härleds från dess överordnade kontroll, ctlClock. Du lär dig att utöka funktionerna i ctlClock genom att åsidosätta överordnade metoder och lägga till nya metoder och egenskaper.

Det första steget när du skapar en ärvd kontroll är att härleda den från den överordnade kontrollen. Den här åtgärden skapar en ny kontroll som har alla egenskaper, metoder och grafiska egenskaper för den överordnade kontrollen, men som också kan fungera som bas för att lägga till nya eller ändrade funktioner.

Skapa den ärvda kontrollen

  1. I Solution Explorerhögerklickar du på ctlClockLib, pekar på Lägg tilloch klickar sedan på Användarkontroll.

    Dialogrutan Lägg till nytt objekt öppnas.

  2. Välj mallen för ärvd användarkontroll .

  3. I rutan Namn skriver du ctlAlarmClock.csoch klickar sedan på Lägg till.

    Dialogrutan arvsväljare visas.

  4. Under komponentnamn, dubbelklicka på ctlClock.

  5. I Solution Explorerbläddrar du igenom de aktuella projekten.

    Anteckning

    En fil med namnet ctlAlarmClock.cs har lagts till i det aktuella projektet.

Lägg till larmegenskaperna

Egenskaper läggs till i en ärvd kontroll på samma sätt som de läggs till i en sammansatt kontroll. Du använder nu syntaxen för egenskapsdeklarationen för att lägga till två egenskaper i kontrollen: AlarmTime, som lagrar värdet för datum och tid då larmet ska utlösas och AlarmSet, vilket anger om larmet har angetts.

Så här lägger du till egenskaper i den sammansatta kontrollen

  1. I Solution Explorerhögerklickar du på ctlAlarmClockoch klickar sedan på Visa kod.

  2. Leta upp public class-instruktionen. Observera att din kontroll ärver från ctlClockLib.ctlClock. Under den inledande klammerparantesen ({)-instruktionen ) skriver du följande kod.

    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;
        }
    }
    

Lägg till i kontrollens grafiska gränssnitt

Din ärvda kontroll har ett visuellt gränssnitt som är identiskt med den kontroll som den ärver från. Den har samma beståndsdelar som den överordnade kontrollen, men egenskaperna för de ingående kontrollerna kommer inte att vara tillgängliga om de inte specifikt exponerades. Du kan lägga till i det grafiska gränssnittet för en ärvd sammansatt kontroll på samma sätt som du skulle lägga till i en sammansatt kontroll. Om du vill fortsätta att lägga till i väckarklockans visuella gränssnitt lägger du till en etikettkontroll som blinkar när larmet ljuder.

Så här lägger du till etikettkontrollen

  1. I Solution Explorerhögerklickar du på ctlAlarmClockoch klickar sedan på View Designer.

    Designern för ctlAlarmClock öppnas i huvudfönstret.

  2. Klicka på kontrollens visningsdel och visa fönstret Egenskaper.

    Notis

    Alla egenskaper visas, men de är nedtonade. Detta indikerar att dessa egenskaper är inbyggda i lblDisplay och inte kan ändras eller nås i fönstret Egenskaper. Som standard är kontroller i en sammansatt kontroll privateoch deras egenskaper är inte tillgängliga på något sätt.

    Notera

    Om du vill att efterföljande användare av din sammansatta kontroll ska ha åtkomst till dess interna kontroller deklarerar du dem som public eller protected. På så sätt kan du ange och ändra egenskaper för kontroller som finns i den sammansatta kontrollen med hjälp av lämplig kod.

  3. Lägg till en Label kontroll i den sammansatta kontrollen.

  4. Dra Label kontrollen direkt under visningsrutan med hjälp av musen. I fönstret Egenskaper anger du följande egenskaper.

    Egenskap Inställning
    namn lblAlarm
    Text Larm!
    TextAlign MiddleCenter
    synlig false

Lägg till larmfunktionerna

I föregående procedurer har du lagt till egenskaper och en kontroll som aktiverar larmfunktioner i din sammansatta kontroll. I den här proceduren lägger du till kod för att jämföra den aktuella tiden med larmtiden och, om de är desamma, för att blinka ett larm. Genom att åsidosätta timer1_Tick-metoden för ctlClock och lägga till ytterligare kod i den utökar du funktionen för ctlAlarmClock samtidigt som du behåller alla inbyggda funktioner i ctlClock.

Så här åsidosätter du metoden timer1_Tick ctlClock

  1. Leta upp private bool blnAlarmSet;-instruktionen i Kodredigeraren. Lägg till följande instruktion omedelbart under den.

    private bool blnColorTicker;
    
  2. I Code Editorletar du upp den avslutande klammerparentesen (}) i slutet av klassen. Lägg till följande kod precis före klammerparentesen.

    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;
            }
        }
    }
    

    Tillägget av den här koden utför flera uppgifter. Instruktionen override dirigerar kontrollen till att använda den här metoden i stället för den metod som ärvdes från baskontrollen. När den här metoden anropas anropas metoden som den åsidosätter genom att anropa base.timer1_Tick-instruktionen, vilket säkerställer att alla funktioner som ingår i den ursprungliga kontrollen återskapas i den här kontrollen. Den kör sedan ytterligare kod för att införliva larmfunktionen. En blinkande etikettkontroll visas när larmet inträffar.

    Din väckarklocka kontroll är nästan klar. Det enda som återstår är att implementera ett sätt att stänga av det. För att göra detta lägger du till kod i metoden lblAlarm_Click.

Implementera avstängningsmetoden

  1. I Solution Explorerhögerklickar du på ctlAlarmClock.csoch klickar sedan på View Designer.

    Designern öppnar.

  2. Lägg till en knapp i kontrollen. Ange knappens egenskaper enligt följande.

    Egenskap Värde
    namn btnAlarmOff
    Text Inaktivera larm
  3. Dubbelklicka på btnAlarmOffi designern.

    Code Editor öppnas på raden private void btnAlarmOff_Click.

  4. Ändra den här metoden så att den liknar följande kod.

    private void btnAlarmOff_Click(object sender, System.EventArgs e)
    {
        // Turns off the alarm.
        AlarmSet = false;
        // Hides the flashing label.
        lblAlarm.Visible = false;
    }
    
  5. På menyn Arkiv klickar du på Spara Alla för att spara projektet.

Använda den ärvda kontrollen i ett formulär

Du kan testa den ärvda kontrollen på samma sätt som du testade basklasskontrollen ctlClock: Tryck på F5 för att skapa projektet och köra kontrollen i UserControl-testcontainern. Mer information finns i How to: Test the Run-Time Behavior of a UserControl.

Om du vill använda kontrollen måste du placera den i ett formulär. Precis som med en standardkompositkontroll kan en ärvd sammansatt kontroll inte stå ensam och måste finnas i ett formulär eller en annan container. Eftersom ctlAlarmClock har ett större djup av funktionalitet krävs ytterligare kod för att testa det. I den här proceduren skriver du ett enkelt program för att testa funktionerna i ctlAlarmClock. Du skriver kod för att ange och visa egenskapen AlarmTime för ctlAlarmClockoch testar dess inneboende funktioner.

För att bygga och lägga till din kontroll i ett testformulär

  1. I Solution Explorerhögerklickar du på ctlClockLiboch klickar sedan på Skapa.

  2. Lägg till ett nytt Windows Forms Application-projekt i lösningen och ge den namnet Test.

  3. I Solution Explorerhögerklickar du på noden Referenser för testprojektet. Klicka på Lägg till referens för att visa dialogrutan Lägg till referens. Klicka på fliken med etiketten Projects. Ditt ctlClockLib projekt visas under projektnamn. Dubbelklicka på projektet för att lägga till referensen till testprojektet.

  4. I Solution Explorerhögerklickar du på Testoch klickar sedan på Skapa.

  5. I Toolboxexpanderar du noden ctlClockLib Components.

  6. Dubbelklicka på ctlAlarmClock för att lägga till en kopia av ctlAlarmClock i ditt formulär.

  7. I Toolboxletar du upp och dubbelklickar på DateTimePicker för att lägga till en DateTimePicker kontroll till formuläret och lägger sedan till en Label kontroll genom att dubbelklicka på Etikett.

  8. Använd musen för att placera kontrollerna på en bekväm plats i formuläret.

  9. Ange egenskaperna för dessa kontroller på följande sätt.

    Kontroll Egenskap Värde
    label1 Text (blank space)
    Namn lblTest
    dateTimePicker1 namn dtpTest
    Format Time
  10. Dubbelklicka på dtpTesti designern.

    Code Editor öppnas för private void dtpTest_ValueChanged.

  11. Ändra koden så att den liknar följande.

    private void dtpTest_ValueChanged(object sender, System.EventArgs e)
    {
        ctlAlarmClock1.AlarmTime = dtpTest.Value;
        ctlAlarmClock1.AlarmSet = true;
        lblTest.Text = "Alarm Time is " +
            ctlAlarmClock1.AlarmTime.ToShortTimeString();
    }
    
  12. I Solution Explorerhögerklickar du på Testoch klickar sedan på Ange som StartUp Project.

  13. På menyn Felsökning klickar du på Starta felsökning.

    Testprogrammet startar. Observera att den aktuella tiden uppdateras i kontrollen ctlAlarmClock och att starttiden visas i kontrollen DateTimePicker.

  14. Klicka på DateTimePicker där timmens minuter visas.

  15. Använd tangentbordet och ange ett värde för minuter som är en minut större än den aktuella tiden som visas av ctlAlarmClock.

    Tiden för larminställningen visas i lblTest. Vänta tills den visade tiden når larminställningstiden. När den visade tiden når den tid då larmet är inställt blinkar lblAlarm.

  16. Stäng av larmet genom att klicka på btnAlarmOff. Du kan nu återställa larmet.

I den här artikeln beskrivs ett antal viktiga begrepp. Du har lärt dig att skapa en sammansatt kontroll genom att kombinera kontroller och komponenter till en container för sammansatt kontroll. Du har lärt dig att lägga till egenskaper i kontrollen och att skriva kod för att implementera anpassade funktioner. I det sista avsnittet lärde du dig att utöka funktionen för en viss sammansatt kontroll genom arv och att ändra funktionerna i värdmetoder genom att åsidosätta dessa metoder.

Se även