RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 773014
Accepted
Evgeniy Miroshnichenko
Evgeniy Miroshnichenko
Asked:2020-01-20 00:27:04 +0000 UTC2020-01-20 00:27:04 +0000 UTC 2020-01-20 00:27:04 +0000 UTC

如何在不将给定控件插入 XAML 的情况下获取 WebBrowser 控件的 LoadCompleted 事件?

  • 772

我不需要在 XAML 中使用 WebBrowser,我只需要它能够在加载的 HTML 页面的标签之一上触发 Click 事件。

在页面加载之前,我无法在我想要的标签上触发 Click 事件。为了接收页面加载通知,我需要订阅 LoadCompleted 事件。但据我所知,在将 WebBrowser 添加到 XAML 之前,不会触发 LoadCompleted 事件。

因为我想并行加载许多 HTML 页面,所以在加载多个页面之一之前不断地将 WebBrowser 控件添加到 XAML 标记中,并在加载所需页面后从该标记中删除它的前景不是很方便。

我的目标是访问加载的 HTML 页面上的 Click 事件调用,而不用摆弄 XAML。

是否可以访问 WebBrowser 控件的 LoadCompleted 事件而不将其绑定到 XAML。可能吗?也许还有其他方法?

反映问题本质的代码(WebBrowser 未添加到 XAML)

public partial class SettingsWindow : Window
{
    private WebBrowser browser = new WebBrowser();

    public SettingsWindow()
    {
        InitializeComponent();

        this.browser.LoadCompleted += Browser_LoadCompleted;
        this.browser.Source         = new Uri(@"https://www.google.com.ua/");
        //this.browser.Navigate(path); <-- пробовал загружать страницу и этим способом.
    }

    private void Browser_LoadCompleted(object sender, NavigationEventArgs e)
    {
        // Этот обработчик никогда не вызывается если объект WebBrowser не 
        // добавлен в XAML или не добавлен программным путем в качестве 
        // дочернего компонента к одному из существующих контролов окна.
    }        
}
c#
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    MSDN.WhiteKnight
    2020-02-02T14:38:55Z2020-02-02T14:38:55Z

    实际上,在LoadCompleted将 WPF WebBrowser 的事件添加到某个呈现的窗口或控件之前,不会触发该事件,这是一个已知问题。原因在于 WebBrowser 如何初始化其内部 Internet Explorer ActiveX 控件,该控件负责加载页面。这可以通过查看参考源中的源代码来理解。

    为了使DocumentCompleted内部 ActiveX 对象的事件正常工作,ActiveXHost必须将类设置为 state ActiveXState.InPlaceActive。默认情况下,它在ActiveXState.Running(参见属性初始化)中,在调用BuildWindowCore方法时发生向 InPlaceActive 状态的转换,该方法仅在显示元素的父窗口时调用。此行为不同于 WinForms 中的类似元素,后者在初始化时立即提升为 InPlaceActive,请参见此处)。

    解决方案 1 - 使用 WinForms WebBrowser

    WinForms 中的WebBrowser元素没有这个问题(总是引发类似的事件DocumentCompleted),并且在功能上绝不逊色于 WPF 中的元素。您只需添加对 System.Windows.Forms 的引用并使用它。

    解决方案 2 - 使用屏幕外窗口

    该调用BuildWindowCore需要一个可见窗口,但没有人禁止将坐标设为负值并将窗口置于屏幕之外:

    Window wnd = new Window();
    wnd.Content = browser;
    wnd.ShowInTaskbar = false;
    wnd.Top = -1000;
    wnd.Left = -1000;
    wnd.Width = 0;
    wnd.Height = 0;
    wnd.Show(); 
    

    解决方案 3 - 使用反射的肮脏破解

    只需调用内部方法TransitionUpTo,将常量 InPlaceActive (4) 作为参数传递:

    using System.Reflection;
    const int InPlaceActive = 4;
    
    //...
    
    var method = browser.GetType().GetMethod("TransitionUpTo",BindingFlags.NonPublic | BindingFlags.Instance);
    method.Invoke(browser, new object[] {InPlaceActive});
    
    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5