Próbuję ustawić źródło obrazu WPF w kodzie. Obraz jest osadzony jako zasób w projekcie. Przeglądając przykłady, wymyśliłem poniższy kod. Z jakiegoś powodu to nie działa - obraz się nie wyświetla.
Podczas debugowania widzę, że strumień zawiera dane obrazu. Więc co jest nie tak?
Assembly asm = Assembly.GetExecutingAssembly();
Stream iconStream = asm.GetManifestResourceStream("SomeImage.png");
PngBitmapDecoder iconDecoder = new PngBitmapDecoder(iconStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
ImageSource iconSource = iconDecoder.Frames[0];
_icon.Source = iconSource;
Ikona jest zdefiniowana mniej więcej tak: <Image x:Name="_icon" Width="16" Height="16" />
<Image Source="some_fully_qualified_path">
w XAML nigdy nie zawodzi.Odpowiedzi:
Po tym samym problemie co ty i po przeczytaniu odkryłem rozwiązanie - spakuj identyfikatory URI .
Zrobiłem następujące w kodzie:
Lub krócej, używając innego konstruktora BitmapImage:
Identyfikator URI jest podzielony na części:
application:///
Ścieżka: nazwa pliku zasobów, który jest kompilowany w przywoływany zespół. Ścieżka musi być zgodna z następującym formatem:
AssemblyShortName[;Version][;PublicKey];component/Path
Trzy ukośniki
application:
muszą zostać zastąpione przecinkami:I oczywiście upewnij się, że ustawiłeś akcję kompilacji obrazu
Resource
.źródło
BitmapImage(Uri)
konstruktora, co pomaga uniknąć potrzeby wywoływania BeginInit i EndInit. Dodałem to tutaj.Spowoduje to załadowanie obrazu o nazwie „Untitled.png” do folderu o nazwie „Obrazy” z jego „Kompilacją działania” ustawioną na „Zasób” w zespole o nazwie „WpfApplication1”.
źródło
var uriSource = new Uri("Images/Untitled.png", UriKind.Relative);
byłoby wystarczająceJest to nieco mniej kodu i można to zrobić w jednym wierszu.
źródło
Bardzo łatwe:
Aby dynamicznie ustawić obraz elementu menu, wykonaj tylko następujące czynności:
... podczas gdy „icon.ico” może znajdować się wszędzie (obecnie znajduje się w katalogu „Zasoby”) i musi być powiązany jako Zasób…
źródło
Możesz również zmniejszyć to do jednej linii. To jest kod, którego użyłem do ustawienia ikony w moim głównym oknie. Zakłada, że plik .ico jest oznaczony jako Treść i jest kopiowany do katalogu wyjściowego.
źródło
Najprostszy sposób:
źródło
Czy próbowałeś:
źródło
To jest mój sposób:
Stosowanie:
źródło
Oto przykład, który dynamicznie ustawia ścieżkę obrazu (obraz znajduje się gdzieś na dysku zamiast budować jako zasób):
Refleksje na temat ikon ...
Po pierwsze, można by pomyśleć, że właściwość Icon może zawierać tylko obraz. Ale może zawierać wszystko! Odkryłem to przez przypadek, gdy programowo próbowałem ustawić
Image
właściwość bezpośrednio na ciąg znaków ze ścieżką do obrazu. Rezultat był taki, że nie pokazywał obrazu, ale rzeczywisty tekst ścieżki!Prowadzi to do alternatywy, aby nie musieć tworzyć obrazu dla ikony, ale zamiast tego użyj tekstu z czcionką symbolu, aby wyświetlić prostą „ikonę”. W poniższym przykładzie użyto czcionki Wingdings, która zawiera symbol „dyskietki”. Ten symbol jest tak naprawdę postacią
<
, która ma specjalne znaczenie w XAML, więc<
zamiast tego musimy użyć zakodowanej wersji . To działa jak sen! Poniżej pokazano symbol dyskietki jako ikonę w pozycji menu:źródło
Jeśli twój obraz jest przechowywany w ResourceDictionary, możesz to zrobić za pomocą tylko jednego wiersza kodu:
źródło
Jest też prostszy sposób. Jeśli obraz jest ładowany jako zasób do XAML, a kod, o którym mowa, jest kodem dla tej zawartości XAML:
źródło
Umieść ramkę w VisualBrush:
Umieść VisualBrush w GeometryDrawing
Teraz umieść GeometryDrawing w obrazie rysunku:
Umieść to w swoim źródle obrazu i voilà!
Możesz to zrobić o wiele łatwiej:
I w kodzie:
źródło
Jest też prostszy sposób. Jeśli obraz jest ładowany jako zasób do XAML, a kod, o którym mowa, to kluczowy kod dla tej XAML:
Oto słownik zasobów dla pliku XAML - jedyną linią, na której Ci zależy, jest ImageBrush z kluczem „PosterBrush” - reszta kodu służy tylko do pokazania kontekstu
Teraz w kodzie z tyłu możesz to zrobić
źródło
Jak załadować obraz z osadzonych w ikonach zasobów i obrazach (poprawiona wersja Arcturus):
Załóżmy, że chcesz dodać przycisk z obrazem. Co powinieneś zrobić?
Czas załadować nasz obraz do XAML
Gotowy.
źródło
Jestem nowy w WPF, ale nie jestem w .NET.
Pięć godzin spędziłem na dodawaniu pliku PNG do „Projektu biblioteki niestandardowej kontroli WPF” w .NET 3.5 (Visual Studio 2010) i ustawianiu go jako tła kontrolki dziedziczonej przez obraz.
Nic względnego z identyfikatorami URI nie działało. Nie mogę sobie wyobrazić, dlaczego nie ma metody uzyskania identyfikatora URI z pliku zasobów za pośrednictwem IntelliSense, może jako:
Wypróbowałem wiele identyfikatorów URI i grałem z ResourceManager i metodami GetManifest zespołu, ale wszystkie były wyjątkami lub wartościami NULL.
Tutaj piszę kod, który działał dla mnie:
źródło
Jeśli masz już strumień i znasz format, możesz użyć czegoś takiego:
źródło
Trochę za tobą tęskniłeś.
Aby uzyskać osadzony zasób z dowolnego zestawu, musisz wspomnieć nazwę zestawu z nazwą pliku, jak już wspomniałem tutaj:
źródło