我正在创建一个简单的向导控件,带有 TabControl 和几个按钮(下一步,返回)。目标是向开发人员提供此用户控件,以便他们可以添加自己的步骤和步骤中的控件。
一切正常,除了能够选择在每个选项卡项中添加和删除控件的选项卡。
如何在设计器中启用可编辑的 tabcontrol。
[Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(IDesigner))]
public partial class WizardControl : UserControl
{
private Button Button_Final;
private TabControl TabControl1;
private UltraTabSharedControlsPage ultraTabSharedControlsPage1;
private EaseButton Button_Next;
private EaseButton Button_Back;
private SplitContainer splitContainer1;
private WizardContainer wizardContainer1;
public WizardControl()
{
InitializeComponent();
}
[Description("Final Button Text"), Category("Data")]
public string FinalButtonText
{
get => Button_Final.Text;
set => Button_Final.Text = value;
}
[Category("Wizard"), Description("Collection of wizard pages.")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public WizardPages Pages => wizardContainer1.Pages;
[Category("Wizard"), Description("TabControl")]
[Browsable(true), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public TabControl TabControl => wizardContainer1.TabControl;
}
}
容器:
[ToolboxItem(true), ToolboxBitmap(typeof(WizardControl))]
[Description("Provides a container for wizard pages.")]
[DefaultProperty("Pages"), DefaultEvent("SelectedPageChanged")]
public class WizardContainer : ContainerControl, ISupportInitialize
{
private bool initializing;
public WizardContainer()
{
Pages = new WizardPages(this);
Pages.OnAdd += Pages_OnAdd;
}
private void Pages_OnAdd(object sender, NewTabEventArgs e)
{
UltraTab tab = new UltraTab();
tab.Key = e.Id.ToString();
tab.Text = e.Title;
TabControl.Tabs.Add(tab);
}
public void BeginInit() => initializing = true;
public void EndInit() => initializing = false;
[Category("Wizard"), Description("Collection of wizard pages.")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public WizardPages Pages { get; }
public Button NextButton
{
get
{
return (Button)this.Controls.Find("Button_Next", true).ElementAtOrDefault(0);
}
}
public Button BackButton
{
get
{
return (Button)this.Controls.Find("Button_Back", true).ElementAtOrDefault(0);
}
}
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public TabControl TabControl
{
get
{
return (TabControl)this.Controls.Find("TabControl1", true).ElementAtOrDefault(0);
}
}
public UltraTabSharedControlsPage UltraTabSharedControlsPage
{
get
{
return (UltraTabSharedControlsPage)this.Controls.Find("ultraTabSharedControlsPage1", true).ElementAtOrDefault(0);
}
}
internal void MoveNext()
{
if (TabControl != null && TabControl.SelectedTab != null)
{
var index = TabControl.SelectedTab.Index;
var newIndex = index + 1;
if (newIndex != TabControl.Tabs.Count)
{
TabControl.SelectedTab = TabControl.Tabs[newIndex];
}
bool isPageValid = false;
var page = Pages.ElementAtOrDefault(index);
if(page != null)
{
isPageValid = page.IsValid;
}
NextButton.Enabled = newIndex == TabControl.Tabs.Count && isPageValid;
BackButton.Enabled = newIndex != 0;
}
}
internal void MoveBack()
{
if (TabControl != null && TabControl.SelectedTab != null)
{
var index = TabControl.SelectedTab.Index;
var newIndex = index - 1;
if (newIndex != -1)
{
TabControl.SelectedTab = TabControl.Tabs[newIndex];
}
NextButton.Enabled = newIndex != TabControl.Tabs.Count;
BackButton.Enabled = newIndex != 0;
}
}
}