如何的TabControl转换为向导风格的.NET?
-
12-09-2019 - |
题
我想有我在一个向导式的形式,所以我用的TabControl有向导的页面作为我的TabPages。有予以纠正小问题,例如,使得显示在运行时的选项卡。我继承了TabControl的,我加入了一个名为“TabsVisible”财产和纠正它。它工作得很好。 (参见: http://dotnetrix.co.uk/tabcontrol.htm - 添加HideTabs属性,以打开/关闭的TabItems)
但也有像其他小问题: 1.当Ctrl + Tab键被按下的标签得到改变。这是通过重写的onkeydown方法禁用 2.当活动光标在标签列表,如果按下方向键,当前标签页得到改变。如何禁用此?
所以我的问题是 - ?在的TabControl如何禁用箭头键,以便将标签页不会得到改变。
解决方案 4
我做到了以下内容。有一个标志,如果所选择的标签正在从代码改变。如果是的话我允许它,否则它是不允许的。下面的代码工作对我罚款。
Private _selectedTabBeingChangedFromCode As Boolean
Private Function IsDesignMode() As Boolean
Return Me.Site IsNot Nothing AndAlso Me.Site.DesignMode = True
End Function
Public Shadows Property SelectedTab() As System.Windows.Forms.TabPage
Get
Return MyBase.SelectedTab
End Get
Set(ByVal value As System.Windows.Forms.TabPage)
_selectedTabBeingChangedFromCode = True
MyBase.SelectedTab = value
_selectedTabBeingChangedFromCode = False
End Set
End Property
Private Sub WizardTabControl_Selecting(ByVal sender As Object, ByVal e As System.Windows.Forms.TabControlCancelEventArgs) Handles Me.Selecting
If IsDesignMode() Then
Return
End If
If _selectedTabBeingChangedFromCode = False Then
e.Cancel = True
End If
End Sub
其他提示
在换句话说:你不需要的选项卡控制。你为什么不只是使用面板包含您对不同的向导步骤GUI和按钮或别的东西作为向导步骤本身,并保存自己所有的麻烦吗?这样,你就可以自由的这一切,就能风格它,但是你认为合适的 - 更简单,更灵活
要更改您的TabControl的页面禁用箭头键,你可以处理KeyDown事件,而做这样的事情:
private void tabControl_KeyDown(object sender, KeyEventArgs e)
{
bool isArrowKey = e.KeyCode == Keys.Up || e.KeyCode == Keys.Down ||
e.KeyCode == Keys.Left || e.KeyCode == Keys.Right;
e.Handled = isArrowKey;
}
所以基本上你标记事件如果按下的键是方向键为已处理。
我创建了一个WizardControl框架。它采用了wizardFormBase。您加载窗体与用户控件集合。其余情况自动神奇。这是基于以下一系列...
http://weblogs.asp.net/justin_rogers/articles/60155.aspx
第1条是非常愚蠢的......但他的文章2.修复它
我没有做到这一点正是这样。这里是我此位。你将不得不删除Telerik控制引用,并实际控制的WinForms更换引用。
您设置的UIRoot这基本上是面板控制(或任何其它容器控制)的页面加载到。页是用户控件,但你可以改变,要承载任何类型的控制。
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
WizardFormBase
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
希望这有助于。
赛斯