Список Windows в приложении vb.net

У меня есть приложение MDI, в котором я пытаюсь получить список открытых окон для меню ленты ComponentOne. Использование VB.NET. У меня есть эта подпрограмма для создания новой дочерней формы в контейнере MDI:

Private Sub newButton_Click(sender As Object, e As EventArgs) Handles newButton.Click
    ' Create a new instance of the child form.
    Dim ChildForm As New MyProject.MyForm
    'Make it a child of this MDI form before showing it.
    ChildForm.MdiParent = Me

    m_ChildFormNumber += 1
    ChildForm.Text = "Window " & m_ChildFormNumber

    ChildForm.Show()
End Sub

Затем в другом Sub для меню ленты я пытаюсь получить список окон. Я пробовал это:

    Dim frm As System.Windows.Window
    For Each frm In My.Application.Windows
        frmButton = New C1.Win.C1Ribbon.RibbonButton(frm.Title)
    ...

Но я получаю NullReferenceException за коллекцию System.Windows.Window. Итак, я попробовал это:

    For Each Window In My.Application.Windows
        frmButton = New C1.Win.C1Ribbon.RibbonButton(Window.Title)
    ...

Но при этом я получаю «не удалось разрешить перегрузку, потому что ни один доступный« новый »не может быть вызван без сужающего преобразования» в аргументах для нового RibbonButton. Если я включаю Option Strict, конечно, он говорит, что запрещает позднее связывание.

Итак, я думаю, в конечном итоге мне интересно, почему моя коллекция Windows пуста, даже если я открывал дочерние формы. Тогда даже помимо этого, почему New RibbonButton принимает frm.Title, но не Window.Title.

ПРИМЕЧАНИЕ (если вам интересно)... frmButton является объектом класса:

Friend WithEvents frmButton As C1.Win.C1Ribbon.RibbonButton

Благодарю вас!


person Andy    schedule 06.10.2014    source источник
comment
Довольно причудливое сочетание кода Winforms и WPF. Используйте родительское свойство MdiChildren. Избавьтесь от ссылок WPF, они доставят вам неприятности.   -  person Hans Passant    schedule 06.10.2014
comment
ОК - вместо этого сработало использование MdiChildren   -  person Andy    schedule 07.10.2014
comment
Какие ссылки WPF вы имеете в виду?   -  person Andy    schedule 07.10.2014
comment
он имеет в виду Dim frm As System.Windows.Window для WinForms, который должен быть System.Windows.Forms.Form или просто Form, поскольку вам не нужно добавлять все пространства имен   -  person Ňɏssa Pøngjǣrdenlarp    schedule 07.10.2014


Ответы (1)


Благодаря подсказкам из нескольких источников я смог заставить его работать. Если кому-то еще интересно, как это сделать, вот мой пример кода:

Основная форма публичного класса

Private m_ChildFormNumber As Integer
Friend WithEvents frmButton As C1.Win.C1Ribbon.RibbonButton

Private Sub newButton_Click(sender As Object, e As EventArgs) Handles newButton.Click
    ' Create a new instance of the child form.
    Dim ChildForm As New ProofOfConcept.FormResize
    'Make it a child of this MDI form before showing it.
    ChildForm.MdiParent = Me

    m_ChildFormNumber += 1
    ChildForm.Text = "Window " & m_ChildFormNumber

    ChildForm.Show()
End Sub

Private Sub windowMenu_Dropdown(sender As Object, e As EventArgs) Handles windowMenu.DropDown

    Dim count As Integer = Me.MdiChildren.Length
    windowMenu.Items.ClearAndDisposeItems()

    For i As Integer = 0 To count - 1
        frmButton = New C1.Win.C1Ribbon.RibbonButton
        frmButton.Text = Me.MdiChildren(i).Text
        frmButton.Tag = i
        If MdiChildren(i) Is ActiveMdiChild Then
            frmButton.SmallImage = My.Resources.test
        End If
        windowMenu.Items.Add(frmButton)
        AddHandler frmButton.Click, AddressOf frmButton_Click
    Next

End Sub

Private Sub frmButton_Click(sender As Object, e As EventArgs)

    Dim Rb As C1.Win.C1Ribbon.RibbonButton = DirectCast(sender, C1.Win.C1Ribbon.RibbonButton)
    Me.ActivateMdiChild(MdiChildren(CInt(Rb.Tag)))
    Me.MdiChildren(CInt(Rb.Tag)).Focus()

End Sub

Конец класса

person Andy    schedule 08.10.2014