Элемент управления WebBrowser из консольного приложения с использованием F # - PullRequest
1 голос
/ 16 февраля 2020

У меня есть консольное приложение .netcoreapp3.1

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <UseWpf>true</UseWpf>
    <UseWindowsForms>true</UseWindowsForms>
  </PropertyGroup>
  <ItemGroup>
    <Compile Include="Program.fs" />
  </ItemGroup>
</Project>

В Program.fs я создаю экземпляр элемента управления WebBrowser и обрабатываю событие DocumentCompleted

let run() =
    let uri = "https://www.microsoft.com"
    let browser = new WebBrowser()
    browser.DocumentCompleted.Add(fun _ -> handlePage browser uris)
    browser.Navigate(uri)

[<STAThread>]
[<EntryPoint>]
let main argv =
    run()
    Console.ReadKey() |> ignore
    0 

Когда я его запускаю , событие DocumentCompleted никогда не запускается и не обрабатывается - программа запускается до конца.

Я пропал?

Заранее спасибо.

1 Ответ

3 голосов
/ 16 февраля 2020

Я пропал?

Сообщение насос. Вам нужно Dispatcher для запуска приложения WPF.

С другой стороны, вы используете WinForms WebBrowser, которая выставляет событие DocumentCompleted. Вариант WPF имеет событие LoadCompleted, ref this post .

Однако в WPF концепция Loaded связана с визуальным деревом. Поскольку вы не отображаете элемент управления, событие никогда не будет инициировано. Если вместо этого мы используем событие Navigated, мы можем достичь его с минимальными усилиями.

open System
open System.Windows
open System.Windows.Controls

type BrowserApplication() =
   inherit Application()

   let run() =
       let uri = "https://www.microsoft.com"
       let browser = new WebBrowser()
       browser.Navigated.Add(fun _ -> Console.WriteLine("Done navigating"))
       browser.Navigate(uri)

   do run();

[<EntryPoint;STAThread>]  
let main argv =   
    BrowserApplication().Run() 
...