2012-04-28 11 views
6

Używam Kontroli przeglądania w mojej aplikacji Wp7, ale nie mogę umieścić obrazów znajdujących się w katalogu aplikacji w przeglądarce internetowej.Użyj lokalnych obrazów w przeglądarce Webbrowser control

Umieściłem kilka obrazów w folderze w tym samym katalogu, co pliki .cs i .xaml. Teraz próbuję umieścić je w kontrolce przeglądarki, ale wydaje mi się, że to nie działa.

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

dwóch wyżej oczywiście nie działa, wydaje mi się, że powinno być coś takiego:

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

„SilverlightApplication” i „komponent” powinno zostać zastąpione przez coś innego, ale ja nie wiem co :(

Odpowiedz

7

trzeba będzie zapisywać zdjęcia w wyizolowanym zapisu, a następnie wyświetlać obrazy z nie mam zebrała próbki, które można pobrać z następującej lokalizacji: -.

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

Jest to oparte na artykule MSDN How to: Display Static Web Content Using the WebBrowser Control for Windows Phone.

+0

Dziękuję bardzo Paul! Ale robię metodę NavigateToString w przeglądarce sieci Web i mam całą stronę html w ciągu znaków. Z jakiegoś powodu obrazy nie działają, jeśli robię to w ten sposób. : S – MrCornholio

+0

btw. Tylko obrazy w pojedynczej historii nie działają z NavigateToString. Te, które mają absolutny Uri, działają. – MrCornholio

+0

Musisz zapisać swój ciąg do pliku w odizolowanym magazynie również i ustawić właściwość Base na formancie WebBrowser na lokalny katalog, w którym zapisałeś swoje pliki (html, obrazy, css, javascript) – MatthieuGD

0

dobrze można stosować dynamiczne obrazy złączyć wyżej podanym przykładzie aplikacji Paul zaktualizować tablicę dynamicznie

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

i przed zapisu pojedyncze można usunąć istniejący

 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(); 
     } 
    } 
5

On Windows Phone 8, w którym dostępne są niektóre klasy WinRT, można uzyskać ścieżkę do systemu plików w odizolowanym miejscu pamięci. Tak absolutny URL do pliku w IsoStorage byłoby:

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

WebBrowser Sterowanie odbywa takich adresów w NavigateToString() byłyby HTML porządku. Lub możesz wyznaczyć IsoStorage jako bazę i używać względnych adresów URL w całym tekście. isostore: Adresy URL nie działają, próbowałem. Ani też ms-appx://local/.

Dla kompletności można bardzo podobnie uzyskać ścieżkę systemu plików do zasobów aplikacji. To będzie Windows.ApplicationModel.Package.Current.InstalledLocation.Path.

+0

Świetna odpowiedź. Działa doskonale z 'NavigateToString'. Dziękuję bardzo :-) –

+0

@SevaAlekseyev WAŻNE: Powyższa technika nie będzie działać z innymi katalogami w pamięci, które są dostępne dla folderu lokalnego, tylko te w folderze lokalnym i poniżej. Na przykład utworzyłem katalog rodzeństwa na Local o nazwie Temp, używając metody Path.GetTempPath(). Pliki w tym katalogu były * nie * dostępne dla składnika WebBrowser. Skopiowanie ich do folderu lokalnego rozwiązało problem. –

0

To bardzo stary wątek, ale udało mi się znaleźć rozwiązanie, ponieważ właśnie zaktualizowaliśmy aplikację WP7.

Sekretem jest konwersja obrazu do bazy 64 reprezentacja pierwszy, więc zacząć z tym kodem:

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; 
    } 

Teraz, w którym chcesz wprowadzić obraz do kodu (moje są gify) Za pomocą tego

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); 
Powiązane problemy