AxAcroPdf при загрузке сделать что-нибудь

У меня есть winform, где я загружаю PDF в AxAcroPDF.

выглядит примерно так

Public sub LoadSelectedPDF()
    PDF_Reader.Loadfile(TXT_BrowsePDF.Text) 'PDF_Reader is my AxAcroPDF
    TXT_Title.Focus()
End Sub

Теперь, когда я запускаю это, я вижу, что он фокусируется на другом текстовом поле, но теряет фокус при загрузке PDF (и на маленькой панели инструментов для увеличения PDF и всего, что исчезает). Как будто он только начинает загружаться, переходит к следующему ряду, и когда он действительно загружен, он получает фокус. Как я могу сказать ему ждать полной загрузки, а затем сосредоточиться на другом текстовом поле?

2 ответа

Поместите AxAcroPDF в панель, затем:

Public sub LoadSelectedPDF()
    PDF_Reader.Loadfile(TXT_BrowsePDF.Text) 'PDF_Reader is my AxAcroPDF
    panel_pdf.Enabled = False
    TXT_Title.Focus()    
End Sub

в TXT_Title введите событие:

System.Threading.Thread.Sleep(500)
panel_pdf.Enabled = True

Я создал метод расширения для предотвращения кражи кода AxAcroPDF, его следует использовать так:

PDF_Reader.SuspendStealFocus()
PDF_Reader.Loadfile(TXT_BrowsePDF.Text)

Оригинальный исходный файл C# можно найти здесь. Я использовал.NET Reflector для преобразования его в VB.NET (тестируется только в Winforms, он будет хранить данные в PDF_Reader.Tag):

<Extension> _
Friend Class AxAcroPDFFocusExtensions


   <Extension> _
   Public Shared Sub SuspendStealFocus(ByVal pdfControl As AxAcroPDF)
      pdfControl.SuspendStealFocus(250)
   End Sub

   <Extension> _
   Public Shared Sub SuspendStealFocus(ByVal pdfControl As AxAcroPDF, ByVal timeoutInMilliSeconds As Integer)
      pdfControl.Enabled = False;

      Dim t As New Timer
      t.Interval = timeoutInMilliSeconds
      AddHandler t.Tick, New EventHandler(AddressOf AxAcroPDFFocusExtensions.t_Tick)
      t.Start
      pdfControl.Tag = Guid.NewGuid
      t.Tag = New TimerTag(pdfControl, pdfControl.Tag)
   End Sub

   <Extension> _
   Public Shared Sub SuspendStealFocus(ByVal pdfControl As AxAcroPDF, ByVal timeSpan As TimeSpan)
      pdfControl.SuspendStealFocus(CInt(timeSpan.TotalMilliseconds))
   End Sub

   Private Shared Sub t_Tick(ByVal sender As Object, ByVal e As EventArgs)
      Dim timer As Timer = DirectCast(sender, Timer)
      timer.Stop
      timer.Dispose
      Dim t As TimerTag = DirectCast(timer.Tag, TimerTag)
      If Object.ReferenceEquals(t.Control.Tag, t.ControlTag) Then
            t.Control.Enabled = True
      End If
   End Sub



   <StructLayout(LayoutKind.Sequential)> _
   Private Structure TimerTag
      Public ControlTag As Object
      Public Control As AxAcroPDF
      Public Sub New(ByVal control As AxAcroPDF, ByVal controlTag As Object)
            Me.Control = control
            Me.ControlTag = controlTag
      End Sub
   End Structure
End Class
Другие вопросы по тегам