打开表单并单击,但单击选择父表单

Opening an form and clicking, but the click selects the parent form

我有一个表单可以从服务器上选择的文件中打开一个 PDF 文件。 问题是,当我让我的 pdf 预览器打开选定的 PDF 时,window 按原样打开。但似乎鼠标光标仍在聚焦父窗体。不是我打开的包含 PDF 预览的新表格。如果我点击新表单,它会选择后面的父表单。如果我再次单击,它会选择新表单。从那里一切都很好。 这是一种我似乎找不到来源的尴尬。

感觉程序没有聚焦新打开的表单。

我当然可以使用 Me.ShowDialog(),但问题是我无法打开多个 PDF,或者在打开 PDF 的同时使用该程序。这是对于没有 Acrobat Reader 等的用户来说,这是一种备份解决方案。

Execute Sub中dountil循环的原因是让代码等待PDF关闭

我整理了代码以使其更具可读性,希望它足够了。

 ShowDoc(){
  Execute(me, fileName)

这将打开

  Sub Execute(xxxxx)
        Dim prev As New PreviewAPDF
        prev.previewPdf(fileName, FromFrm)

        Do Until prev.isClosed
                Application.DoEvents()
                System.Threading.Thread.Sleep(50)
        Loop
  End Sub
  xxx Lots of stuff happens that is not related xxx

这导致预览 class 称为 PreviewAPDF

Public Class PreviewAPDF
    public isClosed As Boolean = False
    Public Sub previewPDF(XXlotsofstuffXX)
        If myStream IsNotNothing Then 
            Me.pdf.Load(myStream)
        Else 
           Me.pdf.Filepath = file
        End If
        me.owner = parentForm
        Me.Show()
        Me.CenterToParent()
    End Sub
    Private Sub close_click(stuff)
        isCLosed = True
        Me.Close()
    End Sub

是 DoUntil 循环导致的吗?如果是这样,有人对如何以更好的方式做同样的事情有任何建议吗?

'尝试以下

Public Sub previewPDF(XXlotsofstuffXX)
    If myStream IsNotNothing Then 
        Me.pdf.Load(myStream)
    Else 
       Me.pdf.Filepath = file
    End If
    me.owner = parentForm
    Me.Show()
    Me.CenterToParent()

    Me.BringToFront() '<--- Try this
    Me.Focus() '<--- Try this
End Sub

我的解决方案是一起避免使用 Do Until 循环。 一些研究 about Application.DoEvents 让我放弃了使用这种方式来 "halt" 代码的想法。 相反,我通过让代码 运行 顺其自然来避免它,并在稍后编写一个函数来处理代码(我最初正在等待)。

正是 Do UntilApplicationDoEvents 一起导致表单失去焦点,据我所知,这个问题没有简单的解决方法。除了废弃这种过时的做事方式,而是正确地构建,而不是使用这种糟糕的编码实践。