2013-03-15 11 views
5

Ich möchte meine eigene TabControl-Klasse mit Design-Zeit-Unterstützung erstellen.Custom Control Design-Zeit

Das ist mein Designer ist:

public class TabListDesigner : ParentControlDesigner 
{ 
    protected TabList TabListControl { get { return this.Control as TabList; } } 

    protected override void WndProc(ref Message m) 
    { 
     switch (m.Msg) 
     { 
      case 0x7b: // WM_CONTEXTMENU 
       this.OnContextMenu(Cursor.Position.X, Cursor.Position.Y); 
       break; 
      default: 
       base.WndProc(ref m); 
       break; 
     } 
    } 

    protected override bool GetHitTest(Point point) 
    { 
     return this.TabListControl.HitTest(this.TabListControl.PointToClient(point)) != null; 
    } 

    protected override void OnPaintAdornments(PaintEventArgs pe) 
    { 
     base.OnPaintAdornments(pe); 
     ControlPaint.DrawFocusRectangle(pe.Graphics, this.Control.ClientRectangle); 
    } 

    public override void InitializeNewComponent(IDictionary defaultValues) 
    { 
     base.InitializeNewComponent(defaultValues); 
     this.AddTabListPage(); 
     this.AddTabListPage(); 
    } 

    protected virtual void AddTabListPage() 
    { 
     IDesignerHost host = (IDesignerHost)this.GetService(typeof(IDesignerHost)); 

     if (host != null) 
     { 
      using (DesignerTransaction transaction = host.CreateTransaction(string.Format("Add TabListPage to '{0}'", this.TabListControl.Name))) 
      { 
       try 
       { 
        TabListPage page = (TabListPage)host.CreateComponent(typeof(TabListPage)); 
        MemberDescriptor controlsProperty = TypeDescriptor.GetProperties(this.TabListControl)["Controls"]; 

        this.RaiseComponentChanging(controlsProperty); 

        this.TabListControl.Add(page); 
        this.TabListControl.Controls.Add(page); 

        this.RaiseComponentChanged(controlsProperty, null, null); 

        transaction.Commit(); 
       } 
       catch 
       { 
        transaction.Cancel(); 
        throw; 
       } 
      } 
     } 
    } 
} 

im Designer füge ich meinen tabcontrol auf die Form und die 2 TabPages zeigen richtig. Jetzt teste ich das Projekt und die 2 Tabpages verschwinden. Ich gehe zurück zum Designer und die Tabpages sind nicht mehr da. Warum?

+1

Haben Sie versucht, Einstellung up to environment to [debug your design time controls?] (http://msdn.microsoft.com/en-us/library/ms996457.aspx) Hilft sehr viel in der Lage zu sein, durch den Code zu gehen, wie Sie normalerweise markieren könnten Problem Es ist nett, wenn du dem Fluss folgst. – Amicable

+0

Ich denke, das Problem ist mit der Serialisierung. In Ihrem Beispiel wurde eine TabList mit zwei Tabs am Anfang erstellt, aber diese beiden Tabs wurden nicht serialisiert. Überprüfen Sie den Bereich "#pragma-Region Windows Form Designer generierten Code" in Ihrer Formular-Header-Datei. Wenn Sie dort etwas wie TabList-> Items-> Add (TabPage1) nicht finden können; dann wurden deine Seiten serialisiert. –

+0

Ich weiß es nicht, aber eine Sache sieht für mich seltsam aus: Sie fügen die gleiche Seite zuerst zu TabListControl und dann wieder zu TabListControl.Controls hinzu. –

Antwort

0

Ich habe einmal einen Steuerelement-Designer erstellt, nicht diejenigen, die der Formular-Designer verwendet, sondern eher wie ein tatsächlicher Formular-Designer für ein einzelnes Steuerelement. Ich erinnere mich nicht viel an das Projekt, aber ich erinnere mich, dass ich das gleiche Problem hatte, und dass ich Visual Studio warnen musste, dass ich einen Wert auf irgendeine Art und Weise geändert hatte.

Nachdem Sie die Designer-Registerkarte gespeichert haben, wird Visual Studio die Änderung in Code je nach Sprache umwandeln und in die Designer-Datei Ihres Formulars schreiben. Sie können auch Ihren eigenen spezifischen Code-Generator mit codeDom schreiben, aber das ist stark fortgeschritten.

Es ist nicht ganz das, was Sie wollen, aber ich wette, dass das Problem damit zusammenhängt, also ertragen Sie mit mir. Das einzige Beispiel, das ich auf dem Feld finden konnte, war ein acient C# -Projekt namens "Shape designer" oder so. Ich habe es von einer hellblauen Website bekommen. Ich habe ein wenig gesucht, aber ich konnte die Seite nicht finden. Wie auch immer, der Code war gut dokumentiert, und er erklärte Ihr Problem ziemlich gründlich.

Ich habe auch mein Projekt, das eine Tab-ish-Sache ist, die zwischen den Seiten animiert, wenn Sie auf eine andere Seite gehen. Es ist in vb.net, nicht so gut dokumentiert, aber vielleicht möchten Sie einen Blick darauf werfen.

Here's the project, here's a image of the designer und ein animated gif of the end result

EDIT:

In meinem Projekt in der "DesignerControl.vb" Datei, in Zeile 187:

' The controldesigner don't always save properties which are changed directly :/ 
Private Sub SetValue(itm As Item, pName$, val As Object) 
    Dim Prop As PropertyDescriptor = TypeDescriptor.GetProperties(itm.Page)(pName) 
    If Prop IsNot Nothing AndAlso Prop.PropertyType Is val.GetType Then Prop.SetValue(itm.Page, val) 
End Sub 
Verwandte Themen