0

会社のイントラネットページの1つからいくつかの値をスクレイピングしているシナリオがあります。アプリにページを表示する予定はありません。Webページのデータの一部が必要です。

WebBrowserただし、LoadCompleteイベントを発生させるには、Xamlでを作成する必要があることに気づいています。Webページを表示しないので、Xamlで作成したくありません。

これが私が話していることを説明する例です。


Xamlバージョン(イベントは正常に発生します):

Xaml:

<WebBrowser x:Name="webBrowser" Visibility="Collapsed"/>    

コード:

public MainWindow()
{
    InitializeComponent();

    webBrowser.LoadCompleted += WebBrowserOnLoadCompleted;
    webBrowser.Navigate("http://stackoverflow.com/");
}

private void WebBrowserOnLoadCompleted(object sender, NavigationEventArgs navArgs)
{
    MessageBox.Show("PageLoaded");
}

結果:次に、MessageBoxが表示されます。(イベントが発生します)


コードのみのバージョン(イベントは発生しません):

コード:

public MainWindow()
{
    InitializeComponent();

    WebBrowser codeBehindBrowser = new WebBrowser();
    codeBehindBrowser.LoadCompleted += WebBrowserOnLoadCompleted;
    codeBehindBrowser.Navigate("http://stackoverflow.com/");
}

private void WebBrowserOnLoadCompleted(object sender, NavigationEventArgs navArgs)
{
    MessageBox.Show("PageLoaded");
}

結果:イベントは発生しません。


WebBrowserインコードビハインドを作成した場合にイベントを発生させる方法はありますか?

4

3 に答える 3

3

ページを表示する必要がない場合は、WebClientクラスを使用することをお勧めします

WebClient client = new WebClient();
//client.Credentials = new NetworkCredential("username", "password");
string reply = client.DownloadString(address);

UIをブロックしないDownloadStringAsyncメソッドもあります

于 2013-03-06T23:14:51.870 に答える
2

コードビハインドブラウザが読み込まれない理由は、ビジュアルツリーにないためです。つまり、UIに配置されていません。Xamlは、Xamlで作成されたという理由だけで、ビジュアルツリーに配置されているため機能します。

コードからブラウザを作成し、それを機能させるには、ブラウザをビジュアルツリーに配置する必要があります。例えば:

<Window x:Class="WebBrowserLoadTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid x:Name="LayoutRoot"/>
</Window>
public MainWindow()
{
    InitializeComponent();

    WebBrowser codeBehindBrowser = new WebBrowser { Visibility = Visibility.Collapsed };
    codeBehindBrowser.LoadCompleted += CodeBehindBrowserOnLoadCompleted;
    codeBehindBrowser.Navigate("http://stackoverflow.com/");
    this.LayoutRoot.Children.Add(codeBehindBrowser);
}

private void CodeBehindBrowserOnLoadCompleted(object sender, NavigationEventArgs e)
{
    MessageBox.Show("CodeBehindBrowser loaded, yay!");
}

なんらかの方法でビジュアルツリーに挿入されている限り、機能するはずです。

于 2013-03-07T03:02:36.857 に答える
1
        MyWebClient client = new MyWebClient();
        client.DownloadStringCompleted += new MyWebClient.DownloadStringCompletedEventHandler(HandleDownloadStringCompleted);

    // call the async method
        client.DownloadStringAsync(url, handler);
于 2013-03-06T23:28:07.743 に答える