UserControl

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von Facebamm.

    Hallo,

    daher das ich die GUI zum entwickeln des UI von Android liebe, hab ich mir vorgenommen ein paar Dinge nachzuprogrammieren.

    Nun, in Android gibt es die Möglichkeit bei der Weight und Heigth die Px anzugeben und MATCH_PARENT, WRAP_CONTENT und FILL_PARENT anzugeben.
    Nun würde ich das auch gern machen. Momentan sieht mein Code so

    View
    Spoiler anzeigen

    C#-Quellcode

    1. [Serializable]
    2. public class View : UserControl {
    3. private event PaintEventHandler Paint;
    4. private event MouseEventHandler Mouse;
    5. public int Vertikal { get; set; }
    6. public int Horizontal { get;set;}
    7. public View() : base() {
    8. Mouse = new MouseEventHandler(MouseController);
    9. Paint = new PaintEventHandler(OnPaint);
    10. Horizontal = (int) LayoutPrams.MATCH_PARENT;
    11. Vertikal = (int) LayoutPrams.WRAP_CONTENT;
    12. }
    13. protected override void OnSizeChanged(EventArgs e) {
    14. if(Vertikal.Equals(LayoutPrams.MATCH_PARENT))
    15. this.Width = Parent.Width;
    16. if(Horizontal.Equals(LayoutPrams.MATCH_PARENT))
    17. this.Height = Parent.Height;
    18. base.OnSizeChanged(e);
    19. }
    20. private void MouseController(object sender, MouseEventArgs e) {
    21. }
    22. private void OnPaint(object sender, PaintEventArgs e) {
    23. base.OnPaint(e);
    24. }
    25. }


    Enums
    Spoiler anzeigen

    C#-Quellcode

    1. [Serializable]
    2. public enum LayoutPrams {
    3. MATCH_PARENT, WRAP_CONTENT
    4. }
    5. [Serializable]
    6. public enum Orientation {
    7. Horizontal, Vertikal
    8. }


    LinearLayout
    Spoiler anzeigen

    C#-Quellcode

    1. [Serializable]
    2. [Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(IDesigner))]
    3. public class LinearLayout:View {
    4. public Orientation ViewOrientation { get; set; }
    5. public int ViewsPadding { get; set; }
    6. public LinearLayout() : base() {
    7. ViewOrientation = Orientation.Vertikal;
    8. myViews = new List<View>();
    9. ViewsPadding = 0;
    10. }
    11. protected override void OnControlAdded(ControlEventArgs e) {
    12. List<Control> con = Controls.OfType<Control>().ToList();
    13. con.ForEach(x => {
    14. int index = con.IndexOf(x);
    15. if(index == 0) {
    16. x.Location = new Point(0, 0);
    17. } else {
    18. int h = con[index - 1].Height;
    19. x.Location = new Point(0, h + ViewsPadding);
    20. }
    21. });
    22. base.OnControlAdded(e);
    23. }
    24. protected override void OnPaint(PaintEventArgs e) {
    25. if(ViewOrientation.Equals(Orientation.Horizontal)) {
    26. } else {
    27. }
    28. base.OnPaint(e);
    29. }
    30. public void AddView(View view) {
    31. myViews.Add(view);
    32. }
    33. public void AddView(View view, int index) {
    34. myViews.Insert(index, view);
    35. }
    36. public void AddViews(View[] views) {
    37. myViews.AddRange(views);
    38. }
    39. public void AddViews(View[] views, int index) {
    40. myViews.InsertRange(index, views);
    41. }
    42. }



    Meine frage ist, wie kann ich beim View (LinearLayout),Vertikal als Enum und als Int wert angeben im Desginer
    Also das ich eine Vertikale eintragen kann und das ich die Auswahl habe ?

    Ich weiß das man das über die []-klammern macht, aber ich weiß nicht wie, bzw ich weiß nicht mal ein Stichword dafür, was man da verwenden könnte.
    hat jm. eine Idee ?
    @Facebamm Meinst Du so was:

    VB.NET-Quellcode

    1. Public Class MyUserControl
    2. Public Enum Orientation
    3. Horizontal
    4. Vertikal
    5. End Enum
    6. Public Property MyOrientation As Orientation
    7. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Facebamm schrieb:

    Ich weiße drauf
    Wo ist der Unterschied?

    C#-Quellcode

    1. public class MyUserControl
    2. {
    3. public enum Orientation
    4. {
    5. Horizontal,
    6. Vertikal,
    7. }
    8. public Orientation MyOrientation { get; set; }
    9. }
    Die Designer-Edit-Controls sind außerordentlich speziell, da müsstest Du Dir wohl ein eigenes schreiben. Glaub mir, das willst Du nicht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Es geht um das ich im Desginer bei einem Dropdown nicht nur die Eigenschaften von einem Enum sonder auch sonstige Zahlen nehmen kann.
    ZB.
    Anpassung auf das Parent von der Akktuellen Position(Match_Parent)
    Anpassung von den ChildObjeckten(WRAP_CONTENT)
    Anpassung aufs Parent( FILL_PARENT) [Breite und Höhe]
    Und Eigene Breite und Höhe
    Also

    BSP1:
    Breite: MATCH_PARENT
    Höhe: 20
    BSP2:
    Breite: 300
    Höhe: FILL_PARENT

    Und beides soll unter einer Property laufen :D
    Naja, vlt kom ich mal auf ein Hauptproblem,
    Ich hab verschiedene Conrols, die ich Farblich anders gern hätte, ich aber noch kein Lösung gefunden habe.
    Zb.
    Beim DropDown: auf der Linkenseite die Das kästchen mit dem Pfeil nicht grau sondern DeepGray und SkyBlue farbend.

    Facebamm schrieb:

    nicht grau sondern DeepGray und SkyBlue farbend
    Die sollten eine BackColor-Property haben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Facebamm Das sind vom System vorgegebene Farben.
    Du müsstest ein spezielles vorhandenes Control verwenden (kenn ich nicht)
    oder
    Du müsstest das OwnerDraw machen. Glaub mir, das willst Du nicht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wenn du so viel stylen willst, dann schau dir mal WPF an. Hat zwar ne ziemlich steile Lernkurve, aber wenn man sich mal dran gewöhnt hat, dann kann man damit echt alles anpassen - und das auch ziemlich unkompliziert (in dem Zusammenhang evtl. auch mal einen Blick auf Microsoft Blend werfen).
    Twitch Viewer Display Chat-, Zuschauer- und Statistiktool für Streamer
    Ich hab jetzt so fast einigermaßen nach meinen Vorstellungen zusammen geschrieben (Bild im Anhang)

    Instanzierung
    Spoiler anzeigen

    C#-Quellcode

    1. ls_timetable.OwnerDraw = true;
    2. ls_timetable.DrawColumnHeader += new DrawListViewColumnHeaderEventHandler(listView1_DrawColumnHeader);
    3. ls_timetable.DrawItem += new DrawListViewItemEventHandler(listView1_DrawItem);
    4. ls_timetable.Columns.Add(new ColumnHeader() { Text = "Hour" });
    5. ls_timetable.Columns.AddRange(teacher.getDaysOfWeekStrg().Select(x => new ColumnHeader() { Text = x}).ToArray());
    6. ls_lessions.Items.AddRange(teacher.getLessions().Select(item => new ListViewItem() { Text = item }).ToArray());


    Header
    Spoiler anzeigen

    C#-Quellcode

    1. private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
    2. {
    3. SolidBrush gray = new SolidBrush(Color.FromArgb(255, 64, 64, 64));
    4. SolidBrush blue = new SolidBrush(Color.DeepSkyBlue);
    5. Rectangle Body = e.Bounds;
    6. string text = e.Header.Text;
    7. Graphics gr = e.Graphics;
    8. SizeF s = gr.MeasureString(text, e.Font);
    9. RectangleF rec = Body;
    10. StringFormat sf = new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center };
    11. e.DrawBackground();
    12. gr.FillRectangle(gray, Body);
    13. gr.DrawRectangle(new Pen(blue,2), Body);
    14. gr.DrawString(text, e.Font,blue,rec,sf);
    15. }


    Item
    Spoiler anzeigen

    C#-Quellcode

    1. private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
    2. {
    3. e.DrawDefault = true;
    4. }


    Hat jm. noch verbesserungsvorschläge wegen dem Zeichnen, dort bin ich noch etwas unsicher(vlt auch sehr) :D
    Bilder
    • Unbenannt.PNG

      8,9 kB, 385×227, 128 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Facebamm“ ()

    @Facebamm Ich würde die Zeilen und Spalten dieseer Tabelle tauschen.
    Die Wochentage untereinander, die Zeiten nebeneinander.
    Die nächste Woche würde dann einfach unten drangehängt werden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Facebamm Und das Programm ist götlich und macht alles richtig?
    Die meisten Fehler werden bei der Spezifikation gemacht. ;)
    Ist das ein eigenes oder ein gekauftes Programm?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany

    Und das Programm ist götlich und macht alles richtig?
    Ja, ist ja noch im Anfangsstadium

    Das ist mein eigenes Programm woran ich arbeite :D
    Mir fällt nur das Designe schwer zu programmieren, am liebsten würde ich ein kompletten neuen Designer machen aber nein Danke :D

    Was mir noch schwer fällt ist mit Datenbanken zu arbeiten, bzw zu implementieren.
    Aber dafür gibt es ja viele TuT's hier und auf YT :D

    Facebamm schrieb:

    am liebsten würde ich ein kompletten neuen Designer machen
    Das wäre die richtige Entscheidung.
    Klar, Dein Programm ist Dir sehr ans Herz gewachsen, aber Du hast inzwischen gelernt besser zu programmieren, und wenn Du viel mit dem Programm arbeitest, ist das Neu-Machen eine gute Alternative.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!