Вопрос по windows-phone-7, xaml, c# – Использовать локальные изображения в веб-браузере

6

Я использую элемент управления веб-браузера в своем приложении Wp7, но, похоже, я не могу поместить изображения, которые находятся в каталоге приложения, в веб-браузере.

Я поместил некоторые изображения в папку в том же каталоге, что и файлы .cs и .xaml. Теперь я пытаюсь поместить их в элемент управления веб-браузера, но не могу заставить это работать.

<code><img src="images/photo.jpg"/>
<img src="/images/photo.jpg"/>
</code>

Очевидно, что два приведенных выше не работают, я думаю, что это должно быть что-то вроде этого:

<code><img src="/SilverlightApplication;component/photo.jpg"/>
</code>

& Quot; SilverlightApplication & Quot; и «компонент» должно быть заменено чем-то другим, но я не знаю, что :(

Ваш Ответ

4   ответа
7

Вам нужно будет сохранить свои изображения в изолированном хранилище, а затем отобразить изображения оттуда. Я собрал образец, который вы можете скачать из следующих мест: -

www.smartmobiledevice.co.uk/projects/webbrowserimagesample.zip

Это основано на статье MSDNКак отобразить статический веб-контент с помощью элемента управления WebBrowser для Windows Phone.

Привет, @Paul! Есть ли способ загрузить локальные изображения, используяNavigateToString потому что у меня есть несколько изображений нужно загружать изображения динамически на основе выбора пользователя
Вам также необходимо сохранить строку в файл в изолированном хранилище и установить для свойства Base элемента управления WebBrowser локальный каталог, в котором вы сохранили свои файлы (html, images, css, javascript).
Большое спасибо, Пол! Но я делаю метод NavigateToString в веб-браузере, и в строке есть вся HTML-страница. По какой-то причине изображения не работают, если я так делаю. : S MrCornholio
Кстати. Только изображения в изолированной истории не работают с NavigateToString. Iamges с абсолютным Uri работают. MrCornholio
0

объединяя приведенный выше пример приложения Paul, динамически обновляющего массив,

string[] files = {
        "readme.htm", "desert.jpg", "sample.jpg"
    };

и прежде чем писать в изолированный вы можете удалить существующий

       private void SaveFilesToIsoStore()
    {
        //These files must match what is included in the application package,
        //or BinaryStream.Dispose below will throw an exception.
        string[] files = {
        "readme.htm", "desert.jpg", "sample.jpg"
    };

        IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication();
        if(isoStore.FileExists(files[0]))
        {
            isoStore.DeleteFile(files[0]);
        }

            foreach (string f in files)
            {
                StreamResourceInfo sr = Application.GetResourceStream(new Uri(f, UriKind.Relative));
                using (BinaryReader br = new BinaryReader(sr.Stream))
                {
                    byte[] data = br.ReadBytes((int)sr.Stream.Length);
                    SaveToIsoStore(f, data);
                }
            }
        }


    private void SaveToIsoStore(string fileName, byte[] data)
    {
        string strBaseDir = string.Empty;
        string delimStr = "/";
        char[] delimiter = delimStr.ToCharArray();
        string[] dirsPath = fileName.Split(delimiter);

        //Get the IsoStore.
        IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication();

        //Re-create the directory structure.
        for (int i = 0; i < dirsPath.Length - 1; i++)
        {
            strBaseDir = System.IO.Path.Combine(strBaseDir, dirsPath[i]);
            isoStore.CreateDirectory(strBaseDir);
        }

        //Remove the existing file.
        if (isoStore.FileExists(fileName))
        {
            isoStore.DeleteFile(fileName);
        }

        //Write the file.
        using (BinaryWriter bw = new BinaryWriter(isoStore.CreateFile(fileName)))
        {
            bw.Write(data);
            bw.Close();
        }
    }
0

но я нашел решение, так как мы только что обновили приложение WP7.

Секрет в том, чтобы сначала преобразовать изображение в представление base 64, поэтому начнем с этого кода:

    private string GetBase64(string f)
    {
        string ret = "";

        {
            StreamResourceInfo sr = Application.GetResourceStream(new Uri(f, UriKind.Relative));
            using (BinaryReader br = new BinaryReader(sr.Stream))
            {
                byte[] data = br.ReadBytes((int)sr.Stream.Length);
                ret = System.Convert.ToBase64String(data);
            }
        }
        return ret;
    }

Теперь, где вы хотите вставить изображение в код (мои рисунки), используйте это

StringBuilder sb = ... // a string builder holding your webpage
String b64 = GetBase64("assets/images/filename.gif");

sb.AppendFormat(@"<img src='data:image/gif;base64,{0}' /></div>", b64);
5

В Windows Phone 8, где доступны некоторые классы WinRT, можно получить путь к файловой системе изолированного хранилища вашего приложения. Таким образом, абсолютный URL-адрес файла в IsoStorage будет:

string URL = "file://" +
    Windows.Storage.ApplicationData.Current.LocalFolder.Path +
    "\\folder\\filename.png";

Элемент управления WebBrowser принимает такие URL-адреса вNavigateToString()& quot; HTML хорошо. Или вы можете назначить IsoStorage в качестве базового и использовать относительные URL по всему.isostore: URL-адреса не работают, я пробовал. Ни один не делаетms-appx://local/.

Для полноты информации ради этого вы можете очень точно получить путь файловой системы к ресурсам вашего приложения. Это будетWindows.ApplicationModel.Package.Current.InstalledLocation.Path.

Отличный ответ. Отлично работает сNavigateToString, Большое спасибо :-)
@SevaAlekseyev ВАЖНО: описанная выше методика не будет работать с другими каталогами в хранилище, которые находятся в одной папке Local, только с теми, которые находятся в этой папке Local и ниже. Например, я создал одноуровневый каталог Local с именем Temp, используя метод Path.GetTempPath (). Файлы в этом каталоге былиnot доступный компонентом WebBrowser. Копирование их в локальную папку решило проблему.

Похожие вопросы