我创建了一个 WizardControl 框架。它使用了一个wizardFormBase。您使用 UserControl 集合加载表单。其余的会自动神奇地发生。这是基于以下系列...
http://weblogs.asp.net/justin_rogers/articles/60155.aspx
第 1 条非常愚蠢......但他通过第 2 条解决了它。
我没有这样做。这是我的一点。您将不得不删除 Telerik 控件引用并替换为实际的 winforms 控件引用。
您设置 UIRoot,它基本上是面板控件(或任何其他容器控件)以将页面加载到其中。页面是 USerControls,但您可以将其更改为托管任何类型的控件。
Imports System.Windows
Imports System.ComponentModel
Imports System.Windows.Forms
Public Interface IWizardDialog
ReadOnly Property NavigatePrevious() As Control
ReadOnly Property NavigateNext() As Control
ReadOnly Property NavigateFinish() As Control
ReadOnly Property NavigateCancel() As Control
ReadOnly Property UIRoot() As Control
Property Display() As Boolean
End Interface
Public Interface IWizardUserControl
ReadOnly Property ShowNavigatePrevious() As Boolean
ReadOnly Property ShowNavigateNext() As Boolean
ReadOnly Property ShowNavigateFinish() As Boolean
ReadOnly Property ShowNavigateCancel() As Boolean
ReadOnly Property Description() As String
ReadOnly Property StepCaption() As String
End Interface
Public Class WizardController
Private _complete As Boolean = False
Private _wizardIndex As Integer = -1
Private _wizardDialog As IWizardDialog
Private _wizardUserControls As New ArrayList()
Private _allowClose As Boolean = False
Public Sub SetDialog(ByVal dialog As Form)
_wizardDialog = TryCast(dialog, IWizardDialog)
If _wizardDialog Is Nothing Then
Throw New Exception("Wizard must support IWizardDialog interface")
Else
If _wizardDialog.NavigatePrevious Is Nothing Then Throw New Exception("Wizard Dialogs must have a previous button.")
If _wizardDialog.NavigateNext Is Nothing Then Throw New Exception("Wizard Dialogs must have a next button.")
If _wizardDialog.NavigateFinish Is Nothing Then Throw New Exception("Wizard Dialogs must have a finish button.")
If _wizardDialog.NavigateCancel Is Nothing Then Throw New Exception("Wizard Dialogs must have a cancel button.")
If _wizardDialog.UIRoot Is Nothing Then Throw New Exception("Wizard Dialog must have a non null UI Container.")
End If
AddHandler _wizardDialog.NavigatePrevious.Click, AddressOf Wizard_NavigatePrevious
AddHandler _wizardDialog.NavigateNext.Click, AddressOf Wizard_NavigateNext
AddHandler _wizardDialog.NavigateFinish.Click, AddressOf Wizard_NavigateFinish
AddHandler _wizardDialog.NavigateCancel.Click, AddressOf Wizard_Cancel
AddHandler dialog.Closing, AddressOf Me.Wizard_Closing
End Sub
Public Sub AddUserControl(ByVal ctrl As UserControl)
Dim vUserControl As IWizardUserControl = TryCast(ctrl, IWizardUserControl)
If vUserControl Is Nothing Then Throw New Exception("UserControl must implement IWizardUserControl interface.")
_wizardUserControls.Add(ctrl)
End Sub
Public Sub StartWizard()
If _wizardUserControls.Count = 0 Then
Throw New Exception("Must add dialogs to the wizard")
End If
If _wizardIndex <> -1 AndAlso Not _complete Then
Throw New Exception("Wizard has already been started")
End If
_complete = False
_wizardIndex = 0
Try
Dim startControl As UserControl = DirectCast(_wizardUserControls(_wizardIndex), UserControl)
InitUserControl(startControl)
Catch ex As Exception
'do nothing
End Try
_wizardDialog.Display = True
End Sub
Public Sub InitUserControl(ByVal wizardUserControl As UserControl)
wizardUserControl.Dock = DockStyle.Fill
Try
Dim iwp As IWizardUserControl = DirectCast(wizardUserControl, IWizardUserControl)
_wizardDialog.NavigatePrevious.Enabled = iwp.ShowNavigatePrevious
_wizardDialog.NavigateNext.Enabled = iwp.ShowNavigateNext
_wizardDialog.NavigateFinish.Enabled = iwp.ShowNavigateFinish
_wizardDialog.NavigateCancel.Enabled = iwp.ShowNavigateCancel
TryCast(_wizardDialog, Form).Text = iwp.StepCaption
Catch
' Do Nothing
End Try
_wizardDialog.UIRoot.Controls.Clear()
_wizardDialog.UIRoot.Controls.Add(wizardUserControl)
End Sub
Public Sub Wizard_Closing(ByVal Sender As Object, ByVal E As CancelEventArgs)
If _allowClose = False Then
MessageBox.Show("You must complete the wizard in order to exit.")
E.Cancel = True
End If
End Sub
Private Sub CloseWizard(Optional ByVal diagResult As DialogResult = DialogResult.Cancel)
'allows closing of wizard
_wizardDialog.UIRoot.Controls.Clear()
_complete = True
_allowClose = True
TryCast(_wizardDialog, Form).DialogResult = diagResult
End Sub
Public Sub Wizard_NavigateNext(ByVal sender As Object, ByVal e As EventArgs)
_wizardIndex += 1
If _wizardIndex = _wizardUserControls.Count Then
CloseWizard()
' This shouldn't happen if your dialogs are correct
Exit Sub
End If
Try
Dim nextControl As UserControl = DirectCast(_wizardUserControls(_wizardIndex), UserControl)
InitUserControl(nextControl)
Catch ex As Exception
'do nothing
End Try
End Sub
Public Sub Wizard_NavigatePrevious(ByVal sender As Object, ByVal e As EventArgs)
If _wizardIndex > 0 Then
Try
Dim newControl As UserControl = DirectCast(_wizardUserControls(_wizardIndex - 1), UserControl)
InitUserControl(newControl)
_wizardIndex -= 1
Catch
' Do Nothing
End Try
End If
End Sub
Public Sub Wizard_NavigateFinish(ByVal sender As Object, ByVal e As EventArgs)
' this could be fired anywhere in case you have an opt out
' early button on any of your forms.
CloseWizard(DialogResult.OK)
End Sub
Public Sub Wizard_Cancel(ByVal sender As Object, ByVal e As EventArgs)
'put cancel code here
'if needed put validation to see if cancel is allowed. But generally you will allow cancel.
CloseWizard()
End Sub
Public ReadOnly Property Complete() As Boolean
Get
Return _complete
End Get
End Property
Public ReadOnly Property UserControls() As ArrayList
Get
Return _wizardUserControls
End Get
End Property
Public ReadOnly Property WizardDialog() As IWizardDialog
Get
Return _wizardDialog
End Get
End Property
End Class
向导窗体库
Imports System.Windows.Forms
Imports Telerik.WinControls.UI
''' <summary>
''' WizardFormBase
''' </summary>
''' <remarks></remarks>
Public Class WizardFormBase
Implements IWizardDialog
Private _title As String = String.Empty
''' <summary>
''' Initializes a new instance of the WizardFormBase class.
''' </summary>
Public Sub New(ByVal title As String)
_title = title
InitializeComponent()
End Sub
Public ReadOnly Property NavigateCancel() As System.Windows.Forms.Control Implements IWizardDialog.NavigateCancel
Get
Return RadBtn_Cancel
End Get
End Property
Public ReadOnly Property NavigateFinish() As System.Windows.Forms.Control Implements IWizardDialog.NavigateFinish
Get
Return RadBtn_Finish
End Get
End Property
Public ReadOnly Property NavigateNext() As System.Windows.Forms.Control Implements IWizardDialog.NavigateNext
Get
Return RadBtn_Next
End Get
End Property
Public ReadOnly Property NavigatePrevious() As System.Windows.Forms.Control Implements IWizardDialog.NavigatePrevious
Get
Return RadBtn_Previous
End Get
End Property
Public Property Display() As Boolean Implements IWizardDialog.Display
Get
Return Me.Visible
End Get
Set(ByVal value As Boolean)
If value = True Then Me.ShowDialog()
End Set
End Property
Public ReadOnly Property UIRoot() As System.Windows.Forms.Control Implements IWizardDialog.UIRoot
Get
Return Me.mainPanel
End Get
End Property
End Class
WizardFormBase 设计器文件
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class WizardFormBase
Inherits FormBase
'Form overrides dispose to clean up the component list.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
MyBase.Dispose(disposing)
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Me.RadBtn_Next = New Telerik.WinControls.UI.RadButton
Me.RadBtn_Cancel = New Telerik.WinControls.UI.RadButton
Me.RadBtn_Finish = New Telerik.WinControls.UI.RadButton
Me.RadBtn_Previous = New Telerik.WinControls.UI.RadButton
Me.pnlSetupWizardFormButtom = New Telerik.WinControls.UI.RadPanel
Me.mainPanel = New System.Windows.Forms.Panel
CType(Me.RadBtn_Next, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.RadBtn_Cancel, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.RadBtn_Finish, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.RadBtn_Previous, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.pnlSetupWizardFormButtom, System.ComponentModel.ISupportInitialize).BeginInit()
Me.pnlSetupWizardFormButtom.SuspendLayout()
Me.SuspendLayout()
'
'RadBtn_Next
'
Me.RadBtn_Next.Location = New System.Drawing.Point(436, 13)
Me.RadBtn_Next.Name = "RadBtn_Next"
Me.RadBtn_Next.Size = New System.Drawing.Size(75, 23)
Me.RadBtn_Next.TabIndex = 0
Me.RadBtn_Next.Text = "Next >>"
Me.RadBtn_Next.ThemeName = "Office2007Silver"
'
'RadBtn_Cancel
'
Me.RadBtn_Cancel.Location = New System.Drawing.Point(25, 13)
Me.RadBtn_Cancel.Name = "RadBtn_Cancel"
Me.RadBtn_Cancel.Size = New System.Drawing.Size(75, 23)
Me.RadBtn_Cancel.TabIndex = 2
Me.RadBtn_Cancel.Text = "Cancel"
Me.RadBtn_Cancel.ThemeName = "Office2007Silver"
'
'RadBtn_Finish
'
Me.RadBtn_Finish.Location = New System.Drawing.Point(791, 13)
Me.RadBtn_Finish.Name = "RadBtn_Finish"
Me.RadBtn_Finish.Size = New System.Drawing.Size(75, 23)
Me.RadBtn_Finish.TabIndex = 3
Me.RadBtn_Finish.Text = "Finish"
Me.RadBtn_Finish.ThemeName = "Office2007Silver"
'
'RadBtn_Previous
'
Me.RadBtn_Previous.Location = New System.Drawing.Point(355, 13)
Me.RadBtn_Previous.Name = "RadBtn_Previous"
Me.RadBtn_Previous.Size = New System.Drawing.Size(75, 23)
Me.RadBtn_Previous.TabIndex = 1
Me.RadBtn_Previous.Text = "<< Previous"
Me.RadBtn_Previous.ThemeName = "Office2007Silver"
'
'pnlSetupWizardFormButtom
'
Me.pnlSetupWizardFormButtom.BackColor = System.Drawing.Color.Transparent
Me.pnlSetupWizardFormButtom.Controls.Add(Me.RadBtn_Cancel)
Me.pnlSetupWizardFormButtom.Controls.Add(Me.RadBtn_Next)
Me.pnlSetupWizardFormButtom.Controls.Add(Me.RadBtn_Previous)
Me.pnlSetupWizardFormButtom.Controls.Add(Me.RadBtn_Finish)
Me.pnlSetupWizardFormButtom.Dock = System.Windows.Forms.DockStyle.Bottom
Me.pnlSetupWizardFormButtom.Location = New System.Drawing.Point(1, 623)
Me.pnlSetupWizardFormButtom.Name = "pnlSetupWizardFormButtom"
Me.pnlSetupWizardFormButtom.Size = New System.Drawing.Size(898, 46)
Me.pnlSetupWizardFormButtom.TabIndex = 1
Me.pnlSetupWizardFormButtom.TabStop = False
Me.pnlSetupWizardFormButtom.ThemeName = "ControlDefault"
'
'mainPanel
'
Me.mainPanel.Dock = System.Windows.Forms.DockStyle.Fill
Me.mainPanel.Location = New System.Drawing.Point(1, 24)
Me.mainPanel.Name = "mainPanel"
Me.mainPanel.Size = New System.Drawing.Size(898, 599)
Me.mainPanel.TabIndex = 5
'
'WizardFormBase
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(900, 670)
Me.ControlBox = False
Me.Controls.Add(Me.mainPanel)
Me.Controls.Add(Me.pnlSetupWizardFormButtom)
Me.KeyPreview = True
Me.MaximizeBox = False
Me.MaximumSize = New System.Drawing.Size(900, 700)
Me.MinimizeBox = False
Me.MinimumSize = New System.Drawing.Size(575, 325)
Me.Name = "WizardFormBase"
Me.ShowIcon = False
Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
Me.Text = "Setup Wizard"
Me.Controls.SetChildIndex(Me.pnlSetupWizardFormButtom, 0)
Me.Controls.SetChildIndex(Me.mainPanel, 0)
CType(Me.RadBtn_Next, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.RadBtn_Cancel, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.RadBtn_Finish, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.RadBtn_Previous, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.pnlSetupWizardFormButtom, System.ComponentModel.ISupportInitialize).EndInit()
Me.pnlSetupWizardFormButtom.ResumeLayout(False)
Me.pnlSetupWizardFormButtom.PerformLayout()
Me.ResumeLayout(False)
Me.PerformLayout()
End Sub
Friend WithEvents RadBtn_Next As Telerik.WinControls.UI.RadButton
Friend WithEvents RadBtn_Cancel As Telerik.WinControls.UI.RadButton
Friend WithEvents RadBtn_Finish As Telerik.WinControls.UI.RadButton
Friend WithEvents RadBtn_Previous As Telerik.WinControls.UI.RadButton
Friend WithEvents pnlSetupWizardFormButtom As Telerik.WinControls.UI.RadPanel
Friend WithEvents mainPanel As System.Windows.Forms.Panel
End Class
希望这可以帮助。
赛斯