【问题标题】:Display PDF Takes Focus and Eats Hot Key显示 PDF 获得焦点并吃掉热键
【发布时间】:2012-02-18 06:03:02
【问题描述】:

使用我在 SO 上找到的代码使用基于 COM 的 Acrobat Reader 通过托管在 WindowsFormsHost 中来显示 PDF。

它可以很好地显示 PDF。两个问题:

  • 当我加载 PDF 时,控件 AxAcroPDFLib.AxAcroPDF 获得焦点

    我希望专注于之前的

  • 当 AxAcroPDFLib.AxAcroPDF 获得焦点时,它会吃掉热键 (N)

    ALT 键甚至没有在 N 下划线。即使用户选择 AxAcroPDFLib.AxAcroPDF,我也希望热键能够工作。

我知道这是 WPF 中的 COM 和 Adob​​e,可能没有答案。如果有免费或便宜的 WPF 控件来查看 PDF,我会很乐意走这条路。这是用于商业应用程序,因此必须免费(或便宜)用于商业用途。

 <Button  Click="Button_Click">_Next</Button>     

 <WindowsFormsHost Name="windowsFormsHost1"  Margin="1" />
 UserControl1 UC = new UserControl1(@"C:\temp\1000001.pdf");
 this.windowsFormsHost1.Child = UC;


 public UserControl1(string filename)
 {
     InitializeComponent();
     this.axAcroPDF1.LoadFile(filename);
 }

这确实显示 PDF。在生产应用程序中,我根据使用的操作显示各种 PDF。

【问题讨论】:

  • Acrobat Reader 使用了令人讨厌的 hack,控件实际上是另一个进程 (AcroRd32.exe) 拥有的窗口。这有各种副作用,吃击键只是其中之一。不确定这是否重要,用户对 Adob​​e 软件的烦恼有点熟悉。
  • 哦,是的,我很痛苦地意识到,即使在 COM 中,Adobe 也不能很好地发挥作用,而这是 WPF 中的 COM。即使是 windowsFormsHost1 上的按键按下事件也不会触发。 XPS确实玩得很好。我会即时转换为 XPS,但这是用于诉讼支持申请,并且由于监管链的原因,我必须显示 pdf。我可以启动一个本机进程,因此问题是外部的,但这仍然存在问题并且 UI 脱节。
  • 您是否愿意考虑其他第三方 PDF 查看器组件?
  • 如果是这样,我们在让 O2S 的 PDFView4Net 快速运行方面取得了相当大的成功 (o2sol.com/pdfview4net/overview.htm)。注意:是许可的,我只使用过 WinForms 组件,但他们看起来也有 WPF 特定的组件。
  • 看起来 O2S 将 PDF 渲染为图像。不确定这是否会满足我们的监管链限制,但我会检查。定价似乎合理。

标签: .net wpf pdf windowsformshost


【解决方案1】:

不知道它是否适合阅读本文的任何人的需求:我刚刚找到了解决这个问题的方法(有一个输入文本框,并希望它在使用 AxAcroPDFLib.AxAcroPDF 加载 pdf 后重新获得焦点)。

我的解决方案是这样的:

        private void returnFocus(object sender, EventArgs e)
    {
        textBox.Focus();
    }

        this.textBox.LostFocus += new System.EventHandler(this.returnFocus);

为我工作!

【讨论】:

    【解决方案2】:

    汉斯说的。 Acrobat 似乎在吃击键,我对此无能为力。

    【讨论】:

      【解决方案3】:

      我解决这个问题的黑客解决方案是在启用面板之前添加延迟。 显然,您希望添加尽可能少的延迟,但太少了,并且使用错误的文件会再次引起焦点。

          System.Threading.Thread.Sleep(300)
          Panel1.Enabled = True
      

      【讨论】:

        【解决方案4】:

        这对我有用:

        Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
            If Me.AxAcroPDF1.ContainsFocus = True Then
              Me.TextBox1.Focus()
            End If
        End Sub
        

        一旦加载 PDF 文档,'.ContainsFocus' 基本上会变为 True。在快速计时器(约 200 毫秒)中监控此值,并在需要时重新关注另一个控件。不理想,但它工作可靠。

        【讨论】:

          猜你喜欢
          • 2015-05-23
          • 2017-10-23
          • 2022-06-28
          • 1970-01-01
          • 2010-11-09
          • 2012-06-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多