Möglichkeiten Vorlagen für Visual Studio einzelnd zu bekommen?

Wir sammeln alle Infos der Bonusepisode von Pokémon Karmesin und Purpur für euch!

Zu der Infoseite von „Die Mo-Mo-Manie“
  • Ich habe eine kurze Frage.


    Und zwar arbeite ich aktuell an einem Projekt für die Universität und für das Projekt bräuchte ich dringend Zugriff auf die Projektvorlage "Windows-Steuerelementbibliothek".
    Problem: Ich habe die Expressversion und in dieser ist die Vorlage nicht enthalten.
    Ich würde durchaus auch Geld für diese Vorlage ausgeben und dergleichen, nur finde ich via Google leider nichts darüber, wo man diese herbekommen kann.


    Kann mir dahingehend jemand aushelfen? :)

  • Ich glaube nicht, dass es möglich ist, einzelne Vorlagen zu erwerben. Hast du von der Uni aus keinen DreamSpark-Zugriff? Wir kriegen zwei VisualStudio-Lizenzen für jede Version kostenlos.
    Ansonsten könnte ich auch mal schauen, ob ich dir die Vorlage irgendwie geben kann.

  • Dafür Geld auszugeben wär aber ziemlich rausgeschmissenes Geld. Die Vorlage macht nämlich effektiv so gut wie gar nichts.


    Erstell einfach ein normales Bibliotheksprojekt, füg Referenzen zu System.Drawing.dll und System.Windows.Forms.dll hinzu und erstell eine neue Datei vom Typ "Benutzersteuerelement" - fertig, gleiches Ergebnis wie die Vorlage.

  • Danke euch beiden :D


    Ich habe es jetzt hinbekommen ein Steuerelement zu erzeugen - auch wenn es eine ziemliche Fummelei war.


    Aber, da ich dafür keine zwei Thread haben möchte...
    Ich habe nun zweieinhalb weitere Fragen:


    1.1) Ich kann dieses Steuerelement nun auf Knopfdruck einem Panel in einem Fenster hinzufügen. Nur kann ich dummerweise aktuell nur eine Instanz dieses Steuerelements in dem Panel erstellen und ich weiß nicht wieso... Wie kann ich mehrere Instanzen erstellen?
    1.2) Wie kann ich die nächste Instanz immer NEBEN der letzten Instanz erscheinen lassen?
    2) Wie kann ich die Steuerelemente durch das Panel draggen?

  • Zitat

    1.1) Ich kann dieses Steuerelement nun auf Knopfdruck einem Panel in einem Fenster hinzufügen. Nur kann ich dummerweise aktuell nur eine Instanz dieses Steuerelements in dem Panel erstellen und ich weiß nicht wieso... Wie kann ich mehrere Instanzen erstellen?


    Kann ich mir jetzt nicht wirklich was drunter vorstellen... Eigentlich sollte es kein Problem sein, mehrere Instanzen zu erstellen. Kannst du den betreffenden Code posten?


    Zitat

    1.2) Wie kann ich die nächste Instanz immer NEBEN der letzten Instanz erscheinen lassen?


    Mit einem FlowLayoutPanel (ich geh mal davon aus, du nutzt WinForms, und nicht WPF, oder?). Siehe zB hier.


    Zitat

    2) Wie kann ich die Steuerelemente durch das Panel draggen?


    Was meinst damit? Zur Laufzeit?

  • Kann ich mir jetzt nicht wirklich was drunter vorstellen... Eigentlich sollte es kein Problem sein, mehrere Instanzen zu erstellen. Kannst du den betreffenden Code posten?


    Klar, kann ich machen ^^ Auch wenn es jetzt noch nicht großartig was ist, da letzten Endes ich noch im Aufbau begriffen bin. (Den graphischen Kram erspare ich dir, weil der sowieso von VS autogeneriert wird)


    Form, in dem das ganze angezeigt werden soll:

    Code
    public partial class ContentFrom : Form    {        public ContentFrom()        {            InitializeComponent();        }        private void btnNew_Click(object sender, EventArgs e)        {            klassenkarte klasse = new klassenkarte();            paneCont.Controls.Add(klasse);        }


    klassenkarte:

    Code
    public partial class klassenkarte : UserControl
        {
            public klassenkarte()
            {
                    InitializeComponent();
    
    
            }
    }


    Mit einem FlowLayoutPanel (ich geh mal davon aus, du nutzt WinForms, und nicht WPF, oder?). Siehe zB hier.


    Ja, hast du Recht :D
    Vielen dank für den Link! (Sowas muss man erst mal wissen. Davon stand gar nichts in meinem Buch! Danke dafür :D)


    Was meinst damit? Zur Laufzeit?


    Nun. Ich meine damit... Ich füge ja das Steuerelement "klassenkarte" dem Panel hinzu (das ich dann wohl in ein FlowLayoutPanel abändern werde) und möchte die Möglichkeit haben mit der Maus (UND mit Touch, da das Programm Touchgeräte supporten soll) zur Laufzeit halt durch das Panel (wohlgemerkt aber auch nicht bis außerhalb) mit dragdrop verschieben können. Aber ich schnall nicht ganz, wie dragdrop damit funktioniert.


    (Es sei dazu gesagt: Ich lerne C# gerade seit zweieinhalb Wochen und bin aktuell mächtig stolz darauf, dass ich in den 2,5 Wochen weitergekommen bin, als ich es mit Java in zwei Jahren geschafft habe.)

  • Zu 1.: Du erstellst da, wenn du öfter auf deinen Button klickst, durchaus mehrere Instanzen - nur werden die halt alle an der gleichen Position sein, darum siehts aus, als wäre es nur eines.
    Zu 3.: Zum Draggen von UserControls gibts kein Standard-Feature, dass du einfach so verwenden könntest (das, was WinForms unter Drag&Drop versteht, ist etwas völlig anders als das, was du willst). Die einfachste Möglichkeit wäre, die MouseDown, MouseUp und MouseMove Events des UserControls zu behandeln und in denen die Position des Controls entsprechend der Maus-Position zu ändern (schau dir hierzu auch die Control.PointToScreen()-Methode an, die brauchst du für die Koordinatenumrechnung zu Screen-Koordinaten). Google da mal danach, da gibts einige Artikel darüber.

  • So, ich bin nun wesentlich weiter mit der ganzen Geschichte :D Und danke für die Sache mit dem Flow Panel, denn das funktioniert jetzt wunderbar :)


    Allerdings habe ich jetzt noch immer ein Problem: Meine selbstdefinierte UserControl kann ich noch immer nicht dragen. Der Code funktioniert, wenn ich statt meinen definierten Sachen etwas anderes dazufüge, etwas vordefiniertes, nur bei meinem eigenen geht es nicht.


    Inhaltsfenster:


    Ich vermute mal ganz stark, dass es mit der Unterscheidung zwischen UserControlls und Controlls und mit dem hier zu tun hat: "foreach (UserControl c in this.paneCont.Controls)"
    Nur komme ich auf dessen Problem noch immer nicht.

  • Also warum das nicht funktioniert ist recht einfach erklärt: Deine Schleife, mit der du den MouseDown-Eventhandler abonnierst, ist im Load-Event deiner Form. Dieses Event wird gefeuert, wenn die Form fertig geladen ist, und nur dann. Heißt: Dein Code da läuft ein einziges Mal, und das bevor in deinem FlowLayoutPanel auch nur ein einziges Control ist.


    Lösung dafür: Das FlowLayoutPanel hat ein ControlAdded-Event. Abonnier es und ändere deinen Code so:


    Code
    private void ContentForm_Load(object sender, EventArgs e) {    this.paneCont.AllowDrop = true;    this.paneCont.DragOver += new DragEventHandler(paneCont_DragOver);    this.paneCont.DragDrop += new DragEventHandler(paneCont_DragDrop);}private void paneCont_ControlAdded(object sender, ControlEventArgs e) {    e.Control.MouseDown += new MouseEventHandler(c_MouseDown);}


    (Das, was der Load-Handler macht, könnte man eigentlich auch im Forms-Designer machen, dann würdest du dir den ganz sparen.)


    Nur ist das, was das Programm jetzt macht, kein Drag&Drop. Achte mal genau darauf, was passiert, wenn du etwas droppst. Das Control, welches du gedroppt hast, landet ganz hinten an der letzten Stelle. Das liegt daran, dass du es in deinem DragDrop-Handler einfach neu zur Liste der Controls hinzufügst. Eine Möglichkeit, das zu lösen, wäre zum Beispiel folgende:



    Nachteil: Das funktioniert nur, wenn du direkt auf eines der Controls droppst. Droppst du stattdessen in einen Leerraum im FlowLayoutPanel, passiert gar nicht (weil paneCont.GetChildAtPoint dann null liefert). Andere Lösungsmöglichkeiten wären aber doch um einiges komplizierter als diese, also vielleicht kannst du damit leben. Übrigens, nette Idee, wie du WinForms Drag&Drop da mit Controls verwendest. Das Zeug ist eigentlich für Daten gedacht, nicht für Controls. Dass der natürlich das ganze Control in die "Daten" schreibt, wusste ich gar nicht. Ich hätts, wie oben beschrieben, mit MousDown/MouseUp/MouseMove gemacht.


    Zitat

    Ich vermute mal ganz stark, dass es mit der Unterscheidung zwischen UserControlls und Controlls und mit dem hier zu tun hat: "foreach (UserControl c in this.paneCont.Controls)"


    UserControls sind Controls. ;) Sie sind über die Linie Control -> ScrollableControl -> ContainerControl -> UserControl abgeleitet.

  • Also warum das nicht funktioniert ist recht einfach erklärt: Deine Schleife, mit der du den MouseDown-Eventhandler abonnierst, ist im Load-Event deiner Form. Dieses Event wird gefeuert, wenn die Form fertig geladen ist, und nur dann. Heißt: Dein Code da läuft ein einziges Mal, und das bevor in deinem FlowLayoutPanel auch nur ein einziges Control ist.


    *facepalm* Ja, du hast absolut Recht. Und ich bin dumm, weil ich den gleichen Fehler in einem anderen Fall schon einmal gemacht habe und genau dasselbe Problem hatte (nur dass dabei kein Drag Drop, sondern eine andere Reaktion gefragt war, aber das Problem entstand auf dieselbe Art: Bei dem Laden wurden die Sachen vorgegeben und danach aber erst bestimmte Elemente inizialisiert). Danke. Hätte ich selbst drauf kommen müssen.


    Jetzt funktioniert es auch, wie ich es mag :)
    Dazu musste ich nicht einmal groß was ändern, sondern habe nur dafür gesorgt, dass hinzugefügte Controlls auch immer an den Event Handler übergeben werden :)


    Hast du zufälliger Weise Tipps oder ein paar Links für mich zum Thema, wie man freies Drag Drop realisieren kann? Weil das würde mich jetzt schon mal interessieren!