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?
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
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. –
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. –