Üdv,
Kódból szeretném beállítani az Image objektum Source értékét (WPF app). Abszolút útvonal működik:
image.Source = new BitmapImage(new Uri("c:/x/myimage.png"));
A relatív útvonal nem. Hogyan kellene ezt megadni? Hiába néztem a súgót a MS honlapon, valamit elrontok:
image.Source = new BitmapImage( new Uri( "pack://application:,,,/myimage.png" ) );
image.Source = new BitmapImage( new Uri( "pack://application:,,,/component/myimage.png" ) );
// Error: cannot locate source ...
A myimage a projekt főkönyvtárában (is) ott van, ill. a 'component' könyvtárban. Ide másolta amikor beállítom a Designer-ben.
- 633 megtekintés
Hozzászólások
Milyen doksi alapján gondolod, hogy használható ilyen szintaxis?
- A hozzászóláshoz be kell jelentkezni
Onnan, hogy ezt adja vissza:
MessageBox.Show( image.Source.ToString() );
- A hozzászóláshoz be kell jelentkezni
Ez egy programrészlet. Azt sajnos nem látom innen Békásmegyerről, hogy ennek hatására mi jelent meg a képernyődön. Kérlek idézd be inkább.
- A hozzászóláshoz be kell jelentkezni
A WPF-et nem vagom (hal' Istennek :)), de a pack:// itt mi akar lenni?
Nezd meg, hogy masolodik-e a kepfajl a build output folderbe, es ha igen, new Uri("myimage.png"). Vagy meg hulyebiztosabb, ha
- A hozzászóláshoz be kell jelentkezni
Nem másolja az EXE mellé (output). Ha odamásolom akkor se jó neki:
System.UriFormatException: 'Invalid URI: The format of the URI could not be determined.
- A hozzászóláshoz be kell jelentkezni
Nem értek a C#-hoz, de ha odamásoltad a fájlt az EXE mellé, akkor a helyes URI
image.Source = new BitmapImage(new Uri("myimage.png"));
esetleg
image.Source = new BitmapImage(new Uri("file://./myimage.png"));
Ez a "pack:" protokoll egyébként egész véletlenül nem egy shorthand akarna lenni fordítási idejű data URI generáláshoz? Akárhogy is, a ",,,/myimage.png" a végén tutira azt jelenti, hogy az aktuális meghajtó gyökérkönyvtárában keresse, ott meg jogos, hogy nem találja. Bár a hibaüzenet inkább azt jelenti, hogy a "pack:" protokoll nincs támogatva.
- A hozzászóláshoz be kell jelentkezni
A kolléga jól adja meg a "pack://application:,,,/myimage.png" részt. Az "application:,,," rész is jó, mert a program azt "application:///"-ként használja, csak mivel a "/" karakter foglalt, így helyettesíteni kell.
Mellékesen az írt pack hivatkozások is abszolút elérési utak és nem relatívak, mert az application (vagy a siteoforigin) pontosan meghatározza honnan fut az alkalmazás.
Esetleg a következő mód ha relatív elérés kell:
image.Source = new BitmapImage( new Uri( "/component/myimage.png", UriKind.Relative ) );
"Errors are red
My screen in blue
Someone help me
I've deleted Sys32"
- A hozzászóláshoz be kell jelentkezni
A kolléga jól adja meg a "pack://application:,,,/myimage.png" részt.
Szerintem nem.
Mellékesen az írt pack hivatkozások is abszolút elérési utak és nem relatívak
Erről van szó. Emiatt biztos, hogy a fájlrendszer gyökerében keresné a fájlt, és nem pedig az EXE könyvtárában.
De igazából mindegy is, mert a hibaüzenet egyértelműen az, hogy a "pack:" protokoll nem használható. Szóval szerintem érdemesebb a "file:"-al próbálkozni, esetleg beágyazni a fájlt "data:" URI-val, és akkor nincs szükség külön png-re és elérési út mókolásra.
(Ps. nem ismerem a C#-t, de nekem gyanús, hogy a specifikáció szerint a "/component/myimage.png" nem egy érvényes URI, annak ugyanis mindenképp "protokoll:"-al kell kezdődnie. Ettől persze még a C#-os URI class elfogadhatja, és magától elébiggyesztheti, hogy "file:", ezt a részét nem vágom.)
- A hozzászóláshoz be kell jelentkezni
A "file://./myimage.png" sem igazán jó neki:
System.UriFormatException: 'Invalid URI: The hostname could not be parsed.'
- A hozzászóláshoz be kell jelentkezni
Be kell állitani, hogy content. Meg a fasztudja mit, hogy buildkor rakja bele.
- A hozzászóláshoz be kell jelentkezni
Szerintem a content csak másol, szeintem neki az <EmbeddedResource Include="file.png" /> tag kellene a csproj-ba. Amúgy VS-val a file property-jei között lehet állítani (Build Action: Embedded Resource, https://learn.microsoft.com/en-us/visualstudio/ide/build-actions?view=v…), ha nem szeretné kézzel beírni a csproj-ba. De az URI szerintem is jó. Bővebben: https://learn.microsoft.com/en-us/dotnet/desktop/wpf/app-development/pa…
- A hozzászóláshoz be kell jelentkezni
https://learn.microsoft.com/en-us/dotnet/desktop/wpf/app-development/pa…
Első ránézésre ez nem relatív útvonalat jelent, hanem az exe/dll fájlba beleforgatott resource-ra hivatkozik.
- A hozzászóláshoz be kell jelentkezni
A pack emlékeim szerint resource-file elérésére való.
Neked valami ilyesmi kell:
new Uri("file://", Path.Combine(AppContext.BaseDirectory, "component/myimage.png"))
- A hozzászóláshoz be kell jelentkezni
Szerintem ő pont, hogy embedded resource-ot szeretne használni, csak nem fordította bele a binárisba a képet, ezért nem találja a WPF.
- A hozzászóláshoz be kell jelentkezni
bmp fájt probáltál? (egyetemi példákban mindig az volt)
- A hozzászóláshoz be kell jelentkezni
new BitmapImage(new Uri("myimage.png", UriKind.Relative));
Ez nem jo?
- A hozzászóláshoz be kell jelentkezni
Ezt is próbáltam. Nem jó.
Nem szál el hibával, csak nem tölt be semmit. :o
- A hozzászóláshoz be kell jelentkezni
De azt amúgy láttad, hogy fentebb már leírtuk a megoldást?
- A hozzászóláshoz be kell jelentkezni
Melyik az? :)
- A hozzászóláshoz be kell jelentkezni
A pack:// séma embedded resource-hoz való, nem a fájlrendszeren keresgél, hanem az exe/dll belsejében. A relatív elérésnél file:// séma kell, és neki kell megadni, hogy mihez képest legyen relatív.
Ezek már tegnap le lettek írva, de a kérdező ignorálta, és még ma is azt írta, hogy próbálkozik és nem megy.
- A hozzászóláshoz be kell jelentkezni
Azt lattam, hogy a pack:// az hulyeseg, de a helyes megfejtes nem volt leirva mellette. :)
- A hozzászóláshoz be kell jelentkezni
Működő válasz nem volt, de már rátaláltam. 😉
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
Az nem működött.
- A hozzászóláshoz be kell jelentkezni
Megoszthatnád azoknak akik erre keresnek a jövőben, mert ez a topik első helyen lesz a google-ben.
- A hozzászóláshoz be kell jelentkezni
Így működik pl., köszönöm Mindenkinek!
image.Source = new BitmapImage(new Uri(AppContext.BaseDirectory + "/component/myimage.png", UriKind.Absolute ));
Az "AppContext.BaseDirectory" visszaadja az aktuális könyvtárat (EXE).
De még megpróbálom a UriKind.Relative beállítást.
- A hozzászóláshoz be kell jelentkezni
megadhatod így is:
image.Source = new BitmapImage(new Uri("myimage.png", UriKind.Relative)) { BaseUri = new Uri(AppContext.BaseDirectory) };
vagy saját magad töltöd be a filet és a
BitmapImage.StreamSource
propertyjével adod meg.
- A hozzászóláshoz be kell jelentkezni
Egy lehetőség lehet az is, hogy Reflectionnel megnézed az exe futási helyét és ha a képek ugyanabba folderbe vannak mindig akkor csak simán összekonkatenálod az útvonalat és kész. A képekre meg beállitod a Visual Studio-ban hogy always copy.
- A hozzászóláshoz be kell jelentkezni
Miért kell ehhez reflection?
- A hozzászóláshoz be kell jelentkezni