2011-07-26 14 views
8

Ustawiam zawartość przycisku na obraz. Wygląda to mniej więcej tak:W czasie projektowania pakiet uri jest ważny, ale nie w czasie wykonywania?

<Button> 
    <Image Source="pack://application:,,,/NavigationImages/nav_up_left.png" /> 
</Button> 

W moim projekcie mam podfolder o nazwie NavigationImages i w tym folderze jest nav_up_left.png plik obrazu.

Po wyświetleniu projektanta pojawia się obraz, jednak w czasie wykonywania otrzymuję komunikat o błędzie IOException, który mówi, że nie może zlokalizować zasobu.

Akcja kompilacji jest ustawiona na zasób.

Właściwie to zadziałało dobrze w jednym projekcie. Ale kiedy skopiowałem go do innego projektu, nie udało się. Wydaje się to niewiarygodnie prostym problemem, ale jestem zakłopotany i gotowy do rozpoczęcia wyciągania włosów. @ _ @

Twoje myśli i sugestie zostaną docenione!

Odpowiedz

9

Whelp, wymyśliłem to ... trochę.

Skopiowałem ten kod xaml z jednego projektu, którego typem wyjściowym jest Aplikacja systemu Windows, do innego projektu, którego typem wyjściowym jest Biblioteka klas.

Nie myślałem o tym w tym czasie, ale najwyraźniej, gdy typem wyjścia jest biblioteka klas, identyfikator URI paczki musi się zmienić.

Więc zamiast "pack://application:,,,/NavigationImages/nav_up_left.png" zmieniłem go na "/ProjectName;component/NavigationImages/nav_up_left.png" i teraz działa dobrze.

Nie jestem w 100% jasny, dlaczego to działa, a nie pierwszy. Przeczytałem przez MSDN documentation on pack URIs in WPF, ale być może źle zinterpretowałem coś.

Zostawię tę odpowiedź niezaznaczoną w przypadku, gdy ktoś może dać mi dobre wyjaśnienie, dlaczego to, co poprzednio miałem, nie działa w projekcie z typem wyjściowym Biblioteka klas.

Prawdopodobnie brakuje mi czegoś naprawdę prostego. @ _ @

+0

zagmatwany ... czy zmieniłeś go na to, co podajesz, lub na "pakiet: // aplikacja :,,, nazwa_projektu; komponent/NavigationImages/nav_up_left.png"? – mike01010

+1

Witam. Minęło trochę czasu odkąd miałem ten problem, ale jestem pewien, że zmieniłem go na "/ProjectName;component/NavigationImages/nav_up_left.png" –

+0

Właśnie to przetestowałem. Obydwie opcje działają (z pakietem: // aplikacja: ,,, i bez). – surfen

1

Innym rozwiązaniem do uzyskania tego prawa:

Gdy obraz Budowa Action jest ustawiony na „zasób” i zostały odbudowane, przejdź do właściwości swojego obiektu <Image />. Okno właściwości zapewni przeglądarkę do ... zasobów plik, po czym wybierając obraz z atrybutem <Image /> zostanie poprawnie wypełniony Source="...".

2

Wystarczy świecić światło na to, co dzieje się w danej sytuacji. Drugi pakiet uri. Ten, który działał. Jest przeznaczony dla zasobów znajdujących się w zespole innym niż aplikacja hosta. Według odgłosów, aplikacja hosta ładowała ten zasób z biblioteki klas, o której mowa?

można zobaczyć różnice w schematach uri paczka tutaj: MSDN Pack URI Scheme

URI zmian nieznacznie po przedstawieniu zasób od głównego zespołu i odwoływania jednego z innego zespołu.

Ponadto pakiet: // application: ,,, zawiera to, co jest określane jako "organ", pominięcie go spowoduje, że będzie to ścieżka względna, obie są ważne w większości przypadków, gdy zakłada się władzę aplikacji .

EDYCJA: w zasadzie dlatego, że /Subfolder/Resource.xaml(.jpg itp.) I /Assembly/component/Resource.xaml są bardzo podobne, to drugie mówi parserowi/programowi ładującemu, że szuka w zespole referencyjnym, a nie w główny zespół aplikacji. (Wyobrażam sobie, że to pomaga przyspieszyć wyszukiwanie).

+0

+1 Jest to prawdopodobnie najbliższe wyjaśnienie tego, co poszło nie tak, metinks :-) – Heliac

3

Po prostu zmagałem się z tym samym problemem od dłuższego czasu i myślę, że część tego, co działo się źle w oryginale, to brakujące słowo "komponent". Ja, na przykład, miał

myBitmapImage.UriSource = new Uri(@"pack://application:,,,/MyApp;images/mona2.jpg"); 

ale powinny mieli

... = new Uri(@"pack://application:,,,/MyApp;component/images/mona2.jpg"); 

Słowo „składnik” nie jest częścią ścieżki, mimo jego wygląd - jest to ciąg dosłowny, który musi bądź tam. Czemu? Ktoś sądził, że to dobry pomysł.

A dla tych, którzy walczą z inną częścią rzeczy, a co z "MyApp"? To jest nazwa Zgromadzenia. Kliknij prawym przyciskiem myszy nazwę twojego projektu, wybierz "Właściwości ...", a pod zakładką "Aplikacja" zobaczysz pole "Nazwa zespołu:".

Jeśli nie masz ochoty na poszukiwania, które (lub obawiają się, że może to zmienić, łamanie kodu), można to zrobić:

String appUri = @"pack://application:,,,/" + 
        System.Reflection.Assembly.GetEntryAssembly().GetName().Name + ";"; 
String path = appUri + "component/images/mona2.jpg"; 
myBitmapImage.UriSource = new Uri(path); 

Nie kodu bardzo ładny, przyznaję - to możliwe wyraźnie się skracam - mam nadzieję, że dostaniesz się tam, gdzie chcesz się udać. Pamiętaj, aby ustawić właściwość "Buduj" w pliku obrazu na "Zasób"!

Powiązane problemy