Очистка исходного кода веб-страницы для приложения Windows Phone - PullRequest
1 голос
/ 23 января 2012

Я чрезвычайно новичок в разработке с C # для WP7.Я пытаюсь написать простое приложение, которое будет брать URL-адрес из textBox1 и обновлять текст в textBlock1 с исходным кодом для этой страницы при нажатии кнопки 1.

Часть, на которой я застрял, состоит в том, как передать Result в DownloadStringCallback2 обратно в функцию LoadSiteContent, чтобы его можно было вернуть в качестве переменной sourceCode.

Код выглядит следующим образом:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;

namespace TestApp1
{
    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor
        public MainPage()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            string url = textBox1.Text;
            string sourceCode = LoadSiteContent(url);
            textBlock1.Text = sourceCode;
        }

        /// <summary>
        /// method for retrieving information from a specified URL
        /// </summary>
        /// <param name="url">url to retrieve data from</param>
        /// <returns>source code of URL</returns>
        public string LoadSiteContent(string url)
        {
            //create a new WebClient object
            WebClient client = new WebClient();

            //create a byte array for holding the returned data
            string sourceCode = "Fail";
            client.DownloadStringCompleted += new    DownloadStringCompletedEventHandler(DownloadStringCallback2);
           client.DownloadStringAsync(new Uri(url));

           //use the UTF8Encoding object to convert the byte
           //array into a string
           //UTF8Encoding utf = new UTF8Encoding();

           //return the converted string
           //return utf.GetString(html, 0, html.Length);
           return sourceCode;
        }

        private static void DownloadStringCallback2(Object sender, DownloadStringCompletedEventArgs e)
        {
           // If the request was not canceled and did not throw
           // an exception, display the resource.
           if (!e.Cancelled && e.Error == null)
           {
               string textString = (string)e.Result;
           } 
        }
    }
}

1 Ответ

2 голосов
/ 23 января 2012

Вы не можете делать это так, как хотели бы, потому что все веб-запросы в WP7 (silverlight) являются асинхронными. Это означает, что код не останавливается при загрузке веб-страницы и продолжается, когда он заканчивается в той же строке и функции, вместо этого он создает новый поток, загружает файл и вызывает функцию обратного вызова.

Вы должны были бы продолжить в функции обратного вызова (DownloadStringCallback2 в вашем случае). В этой функции вы должны поместить исходный код (e.Result) в текстовое поле.

Могу ли я добавить к этому, если вы когда-либо получите исключение Cross-Thread или если вы хотите, чтобы пользовательский интерфейс был приемлемо применим при выполнении задач, вы можете использовать эту команду:

Dispatcher.BeginInvoke(new Action (() => LoadContent("http://www.google.com")));

Эта команда исправляет исключение Cross-Thread (если я правильно помню) и выполняет код в потоке, отличном от потока UI, таким образом поддерживая стабильный интерфейс.

РЕДАКТИРОВАТЬ Я думаю, ваш код должен выглядеть следующим образом:

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        string url = textBox1.Text;
        LoadSiteContent(url);
    }

    public string LoadSiteContent(string url)
    {
        //create a new WebClient object
        WebClient client = new WebClient();

        client.DownloadStringCompleted += new    DownloadStringCompletedEventHandler(DownloadStringCallback2);
       client.DownloadStringAsync(new Uri(url));
    }

    private static void DownloadStringCallback2(Object sender, DownloadStringCompletedEventArgs e)
    {
       // If the request was not canceled and did not throw
       // an exception, display the resource.
       if (!e.Cancelled && e.Error == null)
       {
           textBlock1.Text = (string)e.Result;
           //If you get the cross-thread exception then use the following line instead of the above
           //Dispatcher.BeginInvoke(new Action (() => textBlock1.Text = (string)e.Result));
       } 
    }
...