2014-04-09 22 views
7

Mam dwa pliki .png dodane do moich zasobów, które muszę uzyskać dostęp do ich Uri podczas wykonywania powiązania.Jak uzyskać URI obrazu przechowywanego w zasobach

Mój kod xaml jest jak następuje:

<Grid> 
    <Image> 
    <Image.Source> 
     <BitmapImage DecodePixelWidth="10" UriSource="{Binding Path=ImagePath}"/> 
    </Image.Source> 
    </Image> 
</Grid> 

i kod binding korzystając ImagePath jest:

ImagePath = resultInBinary.StartsWith("1") ? Properties.Resources.LedGreen : Properties.Resources.ledRed; 

Jednak

Properties.Resources.LedGreen 

zwraca wartość Bitmap zamiast String zawierającą URI tego określonego obrazu. Po prostu chcę wiedzieć, jak wyodrębnić tę wartość bez konieczności adresowania ścieżki obrazu w katalogu, w którym jest przechowywany. (Co szczerze mówiąc nie jestem pewien, czy to słuszne, bo nie mogłem znaleźć podobnej sytuacji w sieci).

Proszę dać mi znać, jeśli istnieje nawet preferowana metoda dla tej, której próbuję użyć, jeśli jest dostępna.

Odpowiedz

18

W aplikacji WPF zwykle nie przechowujesz obrazów w Properties/Resources.resx i można uzyskać do nich dostęp za pomocą klasy Properties.Resources.

Zamiast tego wystarczy dodać pliki obrazów do projektu Visual Studio jako zwykłe pliki, być może w folderze o nazwie "Obrazy" lub podobnym. Następnie ustawisz ich Build Action na Resource, co zostanie wykonane w oknie Właściwości. Dostajesz się tam np. klikając prawym przyciskiem myszy plik obrazu i wybierz pozycję menu Properties. Zauważ, że domyślna wartość Build Action powinna w każdym razie być Resource dla plików graficznych.

Aby uzyskać dostęp do zasobów obrazu z kodu, należy użyć Pack URI. Z wyżej nazwa folderu „Images” i plik obrazu o nazwie „LedGreen.png”, tworząc taki URI będzie wyglądać następująco:

var uri = new Uri("pack://application:,,,/Images/LedGreen.png"); 

Można więc być może zadeklarować swoją nieruchomość do być typu Uri:

public Uri ImageUri { get; set; } // omitted INotifyPropertyChanged implementation 

i ustawić go tak:

ImageUri = resultInBinary.StartsWith("1") 
     ? new Uri("pack://application:,,,/Images/LedGreen.png") 
     : new Uri("pack://application:,,,/Images/LedRed.png"); 

Wreszcie Twój XAML powinien wyglądać jak poniżej, który opiera się na wbudowanym typu z Uri do ImageSource:

<Grid> 
    <Image Width="10" Source="{Binding Path=ImageUri}" /> 
</Grid> 
+0

Dziękuję za odpowiedź opisową i, co ważniejsze, sugestię dotyczącą właściwego sposobu wykonania tej czynności.Zaimplementowałem swoje rozwiązanie w sposób sugerowany przez ciebie, ale zastanawiam się, czy muszę nosić i przechowywać te obrazy z plikiem wykonywalnym, który przekazuję innemu zespołowi? Ponieważ jest to dość prosty projekt, nie planuję zrobić dla niego instalatora. – Mehrad

+1

Nie, akcja kompilacji 'Resource' dodaje pliki obrazów do zespołu. Są więc zawarte w pliku wykonywalnym. – Clemens

1

Zadeklaruj właściwość Properties.Resources.LedGreen jako ImageSource i ustaw ją w położeniu Uri zamiast w obiekcie Bitmap.

Lub jeśli nalegasz na przechowywanie go jako bitmapy, możesz uzyskać źródło, zwracając Properties.Resources.LedGreen.ImageSource, które będzie miało typ ImageSource.

Wolałbym pierwsze podejście.