我想有我在一个向导式的形式,所以我用的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

希望这有助于。

赛斯

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top