Megosztás a következőn keresztül:


WPF-alkalmazáserőforrás, tartalom és adatfájlok

A Microsoft Windows-alkalmazások gyakran olyan fájloktól függenek, amelyek nem végrehajtható adatokat tartalmaznak, például az XAML(Extensible Application Markup Language, XAML), a képeket, a videókat és a hangokat. A Windows Presentation Foundation (WPF) speciális támogatást nyújt az ilyen típusú adatfájlok, úgynevezett alkalmazásadatfájlok konfigurálásához, azonosításához és használatához. Ez a támogatás az alkalmazás adatfájljainak egy meghatározott halmaza körül forog, beleértve a következőket:

  • erőforrásfájlok: Végrehajtható vagy kódtári WPF-szerelvénybe lefordított adatfájlok.

  • tartalomfájlok: Különálló adatfájlok, amelyek explicit társítással rendelkeznek egy végrehajtható WPF-szerelvényhez.

  • Forrásfájlok helye: Önálló adatfájlok, amelyek nem társíthatók végrehajtható WPF-szerelvényekkel.

Az egyik fontos különbség a három fájltípus között, hogy az erőforrásfájlok és a tartalomfájlok ismertek a létrehozáskor; a szerelvény explicit ismeretekkel rendelkezik róluk. A forrásfájlok helyének esetében azonban előfordulhat, hogy a szerelvény egyáltalán nem ismeri őket, vagy implicit ismeretekkel rendelkezik egy csomag egységes erőforrás-azonosító (URI) referenciáján keresztül; az utóbbi esetében nincs garancia arra, hogy a hivatkozott származási hely valóban létezik.

Az alkalmazás adatfájljaira való hivatkozáshoz a Windows Presentation Foundation (WPF) a Csomag egységes erőforrás-azonosító (URI) sémát használja, amelyet a WPFPack URI-jai részletesen ismertetnek.

Ez a témakör az alkalmazásadatfájlok konfigurálását és használatát ismerteti.

Erőforrásfájlok

Ha egy alkalmazásadatfájlnak mindig elérhetőnek kell lennie egy alkalmazás számára, a rendelkezésre állás biztosításának egyetlen módja az, ha egy alkalmazás fő végrehajtható szerelvényébe vagy annak egyik hivatkozott szerelvényébe fordítja. Ezt az alkalmazásadatfájltípust erőforrásfájlnak nevezik.

Az erőforrásfájlokat a következő esetekben érdemes használni:

  • Az erőforrásfájl tartalmát nem kell frissítenie, miután az összeállításra került.

  • Egyszerűsíteni szeretné az alkalmazásterjesztés összetettségét a fájlfüggőségek számának csökkentésével.

  • Az alkalmazásadatfájlnak honosíthatónak kell lennie (lásd WPF-globalizáció és honosítás áttekintése).

Megjegyzés:

Az ebben a szakaszban ismertetett erőforrásfájlok különböznek a XAML-erőforrások részletezett erőforrásfájloktól, és különböznek a Alkalmazáserőforrások kezelése (.NET)ismertetett beágyazott vagy csatolt erőforrásoktól is.

Erőforrásfájlok konfigurálása

A WPF-ben az erőforrásfájl olyan fájl, amely Resource elemként szerepel egy Microsoft buildelési motor (MSBuild) projektben.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ... >
  ...
  <ItemGroup>
    <Resource Include="ResourceFile.xaml" />
  </ItemGroup>
  ...
</Project>

Megjegyzés:

A Visual Studióban úgy hozhat létre erőforrásfájlt, hogy hozzáad egy fájlt egy projekthez, és a Build ActionResourceértékre állítja.

A projekt létrehozásakor az MSBuild lefordítja az erőforrást a szerelvénybe.

Erőforrásfájlok használata

Erőforrásfájl betöltéséhez meghívhatja a GetResourceStream osztály Application metódusát, és átadhat egy csomag URI-t, amely azonosítja a kívánt erőforrásfájlt. GetResourceStream egy StreamResourceInfo objektumot ad vissza, amely Stream ként teszi elérhetővé az erőforrásfájlt, és leírja annak tartalomtípusát.

Az alábbi kód például bemutatja, hogyan használható GetResourceStream egy Page erőforrásfájl betöltésére, és hogyan állíthatja be egy Frame (pageFrame) tartalmaként:

// Navigate to xaml page
Uri uri = new Uri("/PageResourceFile.xaml", UriKind.Relative);
StreamResourceInfo info = Application.GetResourceStream(uri);
System.Windows.Markup.XamlReader reader = new System.Windows.Markup.XamlReader();
Page page = (Page)reader.LoadAsync(info.Stream);
this.pageFrame.Content = page;
' Navigate to xaml page
Dim uri As New Uri("/PageResourceFile.xaml", UriKind.Relative)
Dim info As StreamResourceInfo = Application.GetResourceStream(uri)
Dim reader As New System.Windows.Markup.XamlReader()
Dim page As Page = CType(reader.LoadAsync(info.Stream), Page)
Me.pageFrame.Content = page

A GetResourceStream hívása hozzáférést biztosít a Stream-hez, de el kell végeznie a további munkát, hogy az eredményt átalakítsa a beállítandó tulajdonság típusára. Ehelyett lehetővé teheti, hogy a WPF gondoskodjon a Stream megnyitásáról és átalakításáról úgy, hogy egy erőforrásfájlt közvetlenül egy típus tulajdonságába tölt be kóddal.

Az alábbi példa bemutatja, hogyan tölthet be egy Page közvetlenül egy Frame (pageFrame) kód segítségével.

Uri pageUri = new Uri("/PageResourceFile.xaml", UriKind.Relative);
this.pageFrame.Source = pageUri;
Dim pageUri As New Uri("/PageResourceFile.xaml", UriKind.Relative)
Me.pageFrame.Source = pageUri

Az alábbi példa az előző példa jelölési megfelelője.

<Frame Name="pageFrame" Source="PageResourceFile.xaml" />

Alkalmazáskódfájlok erőforrásfájlokként

A WPF-alkalmazáskódfájlok speciális készletére a csomag URI-jaival hivatkozhat, beleértve az ablakokat, a lapokat, a folyamatdokumentumokat és az erőforrás-szótárakat. Beállíthatja például a Application.StartupUri tulajdonságot egy csomag URI-jával, amely arra az ablakra vagy lapra hivatkozik, amelyet egy alkalmazás indításakor be szeretne tölteni.

<Application
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    StartupUri="SOOPage.xaml" />

Ezt akkor teheti meg, ha egy XAML-fájl Page elemként szerepel egy MSBuild projektben.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ... >
  ...
  <ItemGroup>
    <Page Include="MainWindow.xaml" />
  </ItemGroup>
  ...
</Project>

Megjegyzés:

Amikor a Visual Studióban új Window-t, NavigationWindow-et, Page-t, FlowDocument-at vagy ResourceDictionary-et ad hozzá egy projekthez, a jelölő fájl Build Action alapértelmezettként Pagelesz.

Ha egy Page elemeket tartalmazó projektet fordít, az XAML-elemek bináris formátumba konvertálódnak, és bekerülnek a kapcsolódó gyűjteménybe. Következésképpen ezek a fájlok ugyanúgy használhatók, mint a tipikus erőforrásfájlok.

Megjegyzés:

Ha egy XAML-fájl Resource elemként van konfigurálva, és nem rendelkezik kódot tartalmazó fájllal, a nyers XAML-t nem bináris verzióra, hanem összeállításba fordítják le.

Tartalomfájlok

Egy tartalomfájl végrehajtható assembly mellett különálló fájlként van elosztva. Bár ezek nincsenek összeállításba fordítva, az összeállítások metaadatokkal vannak lefordítva, amelyek társításokat hoznak létre az egyes tartalomfájlokkal.

Akkor érdemes tartalomfájlokat használnia, ha az alkalmazás olyan alkalmazásadatfájlokat igényel, amelyeket frissíteni szeretne anélkül, hogy újrafordítást kellene végeznie az őket használó szerelvényen.

Tartalomfájlok konfigurálása

Ha tartalomfájlt szeretne hozzáadni egy projekthez, egy alkalmazásadatfájlt Content elemként kell tartalmaznia. Továbbá, mivel a tartalomfájl nem közvetlenül az összeállításba van lefordítva, be kell állítani az MSBuild CopyToOutputDirectory metaadat elemet annak megadásához, hogy a tartalomfájl az összeállításhoz viszonyított helyre legyen másolva. Ha azt szeretné, hogy az erőforrás minden projekt létrehozásakor a build kimeneti mappájába legyen másolva, a CopyToOutputDirectory metaadat-elemet a Always értékkel kell beállítania. Ellenkező esetben biztosíthatja, hogy csak az erőforrás legújabb verziója legyen átmásolva a build kimeneti mappájába a PreserveNewest érték használatával.

Az alábbiakban egy tartalomfájlként konfigurált fájlt mutatunk be, amely csak akkor lesz átmásolva a build kimeneti mappájába, ha az erőforrás új verziója hozzáadódik a projekthez.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ... >
  ...
  <ItemGroup>
    <Content Include="ContentFile.xaml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>
  ...
</Project>

Megjegyzés:

A Visual Studióban tartalomfájl létrehozásához hozzá kell adnia egy fájlt egy projekthez, beállítva a Build ActionContentértékre, majd a Copy to Output Directory-t Copy always-ra (ami megegyezik a Always-gyel), valamint a Copy if newer-öt PreserveNewest-ra (ami megegyezik a PreserveNewest-tal).

A projekt létrehozásakor egy AssemblyAssociatedContentFileAttribute attribútum kerül lefordításra minden tartalomfájl szerelvényének metaadataiba.

[assembly: AssemblyAssociatedContentFile("ContentFile.xaml")]

A AssemblyAssociatedContentFileAttribute értéke a tartalomfájl elérési útját jelenti a projektben elfoglalt helyéhez képest. Ha például egy tartalomfájl egy projekt almappájában található, a további elérésiút-információk bele lesznek építve a AssemblyAssociatedContentFileAttribute értékbe.

[assembly: AssemblyAssociatedContentFile("Resources/ContentFile.xaml")]

A AssemblyAssociatedContentFileAttribute érték a build kimeneti mappájában lévő tartalomfájl elérési útjának értéke is.

Tartalomfájlok használata

Tartalomfájl betöltéséhez meghívhatja a GetContentStream osztály Application metódusát, és átadhat egy csomag URI-t, amely azonosítja a kívánt tartalomfájlt. GetContentStream egy StreamResourceInfo objektumot ad vissza, amely Stream ként teszi elérhetővé a tartalomfájlt, és leírja annak tartalomtípusát.

Az alábbi kód például bemutatja, hogyan használható GetContentStream egy Page tartalomfájl betöltésére, és hogyan állíthatja be egy Frame (pageFrame) tartalmaként.

// Navigate to xaml page
Uri uri = new Uri("/PageContentFile.xaml", UriKind.Relative);
StreamResourceInfo info = Application.GetContentStream(uri);
System.Windows.Markup.XamlReader reader = new System.Windows.Markup.XamlReader();
Page page = (Page)reader.LoadAsync(info.Stream);
this.pageFrame.Content = page;
' Navigate to xaml page
Dim uri As New Uri("/PageContentFile.xaml", UriKind.Relative)
Dim info As StreamResourceInfo = Application.GetContentStream(uri)
Dim reader As New System.Windows.Markup.XamlReader()
Dim page As Page = CType(reader.LoadAsync(info.Stream), Page)
Me.pageFrame.Content = page

A GetContentStream hívása hozzáférést biztosít a Stream-hez, de el kell végeznie a további munkát, hogy az eredményt átalakítsa a beállítandó tulajdonság típusára. Ehelyett lehetővé teheti, hogy a WPF gondoskodjon a Stream megnyitásáról és átalakításáról úgy, hogy egy erőforrásfájlt közvetlenül egy típus tulajdonságába tölt be kóddal.

Az alábbi példa bemutatja, hogyan tölthet be egy Page közvetlenül egy Frame (pageFrame) kód segítségével.

Uri pageUri = new Uri("/PageContentFile.xaml", UriKind.Relative);
this.pageFrame.Source = pageUri;
Dim pageUri As New Uri("/PageContentFile.xaml", UriKind.Relative)
Me.pageFrame.Source = pageUri

Az alábbi példa az előző példa jelölési megfelelője.

<Frame Name="pageFrame" Source="PageContentFile.xaml" />

Forrásfájlok helye

Az erőforrásfájlok explicit kapcsolatban állnak azokkal a szerelvényekkel, amelyekkel együtt vannak terjesztve, ahogy azt a AssemblyAssociatedContentFileAttributedefiniálja. Vannak azonban olyan esetek, amikor implicit vagy nem létező kapcsolatot szeretne létrehozni egy szerelvény és egy alkalmazásadatfájl között, beleértve az alábbiakat:

  • A fájl fordításkor nem létezik.

  • Nem tudja, hogy az összeállítás milyen fájlokat igényel a futási időben.

  • Úgy szeretné frissíteni a fájlokat, hogy nem kell újrafordítania a hozzájuk társított assemblyt.

  • Az alkalmazás nagy adatfájlokat, például hang- és videofájlokat használ, és csak akkor szeretné, ha a felhasználók letöltenék őket.

Az ilyen típusú fájlok betöltése hagyományos URI-sémák, például a file:/// és a http:// sémák használatával lehetséges.

<Image Source="file:///C:/DataFile.bmp" />
<Image Source="http://www.datafilewebsite.com/DataFile.bmp" />

A file:/// és http:// sémákhoz azonban az alkalmazásnak teljes megbízhatóságra van szüksége. Ha az alkalmazás egy XAML böngészőalkalmazás (XBAP), amelyet az internetről vagy az intranetről indítottak el, és csak az adott helyről indított alkalmazások számára engedélyezett engedélyeket kéri, a laza fájlok csak az alkalmazás forráshelyéről tölthetők be (indítási helyről). Az ilyen fájlokat forráshelynek fájloknak nevezzük.

A forrásfájlok helye az egyetlen lehetőség a részleges megbízhatósági alkalmazásokhoz, de nem korlátozódnak a részleges megbízhatósági alkalmazásokra. Előfordulhat, hogy a teljes megbízhatósági alkalmazásoknak továbbra is be kell tölteniük azokat az alkalmazásadatfájlokat, amelyekről a buildeléskor nem tudnak; bár a teljes megbízhatósági alkalmazások használhatják a file:///, valószínű, hogy az alkalmazás adatfájljai ugyanabban a mappában lesznek telepítve, mint az alkalmazásszerelvény vagy annak almappája. Ebben az esetben a forráshelyre való hivatkozás használata egyszerűbb, mint a file:/// használata, mivel a file:/// használatához meg kell dolgoznia a fájl teljes elérési útját.

Megjegyzés:

A forrásfájlok nincsenek gyorsítótárazva az ügyfélszámítógépen XAML böngészőalkalmazással (XBAP), míg a tartalomfájlok igen. Következésképpen ezek csak akkor töltődnek le, ha kifejezetten kérik őket. Ha egy XAML böngészőalkalmazás (XBAP) nagy médiafájlokkal rendelkezik, a forrásfájlok helyének konfigurálása azt jelenti, hogy a kezdeti alkalmazásindítás sokkal gyorsabb, és a fájlok csak igény szerint töltődnek le.

Forrásfájlok helyének konfigurálása

Ha a forrásfájlok helye fordításkor nem létezik vagy ismeretlen, a szükséges fájlok futásidőben való rendelkezésre állásának biztosításához hagyományos üzembe helyezési mechanizmusokat kell használnia, beleértve a XCopy parancssori program vagy a Microsoft Windows Installer használatát is.

Ha fordításkor ismeri a forráshelyen elhelyezni kívánt fájlokat, de szeretné elkerülni a explicit függőséget, akkor ezeket a fájlokat hozzáadhatja egy MSBuild-projekthez None elemként. A tartalomfájlokhoz hasonlóan az MSBuild CopyToOutputDirectory attribútumot is be kell állítania annak megadásához, hogy a forrásfájl helye a beépített szerelvényhez viszonyított helyre legyen másolva, a Always vagy a PreserveNewest érték megadásával.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ... >
  ...
  <None Include="PageSiteOfOriginFile.xaml">
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  </None>
  ...
</Project>

Megjegyzés:

A Visual Studióban létrehoz egy eredetfájlt úgy, hogy hozzáad egy fájlt egy projekthez, és beállítja a Build Action-t a None-re.

A projekt létrehozásakor az MSBuild a megadott fájlokat a build kimeneti mappájába másolja.

Forrásfájlok helyének használata

A forrásfájl helyének betöltéséhez meghívhatja a GetRemoteStream osztály Application metódusát, és átadhat egy csomag URI-t, amely azonosítja a forrásfájl kívánt helyét. GetRemoteStream egy StreamResourceInfo objektumot ad vissza, amely Stream ként teszi elérhetővé a forrásfájl helyét, és leírja annak tartalomtípusát.

Az alábbi kód például bemutatja, hogyan használható GetRemoteStream egy Page forrásfájl betöltésére, és hogyan állíthatja be egy Frame (pageFrame) tartalmaként.

// Navigate to xaml page
Uri uri = new Uri("/SiteOfOriginFile.xaml", UriKind.Relative);
StreamResourceInfo info = Application.GetRemoteStream(uri);
System.Windows.Markup.XamlReader reader = new System.Windows.Markup.XamlReader();
Page page = (Page)reader.LoadAsync(info.Stream);
this.pageFrame.Content = page;
' Navigate to xaml page
Dim uri As New Uri("/SiteOfOriginFile.xaml", UriKind.Relative)
Dim info As StreamResourceInfo = Application.GetRemoteStream(uri)
Dim reader As New System.Windows.Markup.XamlReader()
Dim page As Page = CType(reader.LoadAsync(info.Stream), Page)
Me.pageFrame.Content = page

A GetRemoteStream hívása hozzáférést biztosít a Stream-hez, de el kell végeznie a további munkát, hogy az eredményt átalakítsa a beállítandó tulajdonság típusára. Ehelyett lehetővé teheti, hogy a WPF gondoskodjon a Stream megnyitásáról és átalakításáról úgy, hogy egy erőforrásfájlt közvetlenül egy típus tulajdonságába tölt be kóddal.

Az alábbi példa bemutatja, hogyan tölthet be egy Page közvetlenül egy Frame (pageFrame) kód segítségével.

Uri pageUri = new Uri("pack://siteoforigin:,,,/SiteOfOriginFile.xaml", UriKind.Absolute);
this.pageFrame.Source = pageUri;
Dim pageUri As New Uri("pack://siteoforigin:,,,/Subfolder/SiteOfOriginFile.xaml", UriKind.Absolute)
Me.pageFrame.Source = pageUri

Az alábbi példa az előző példa jelölési megfelelője.

<Frame Name="pageFrame" Source="pack://siteoforigin:,,,/SiteOfOriginFile.xaml" />

Újraépítés a build típusának módosítása után

Miután módosította egy alkalmazásadatfájl buildtípusát, újra kell építenie a teljes alkalmazást, hogy biztosan alkalmazza ezeket a módosításokat. Ha csak az alkalmazást hozza létre, a módosítások nem lesznek alkalmazva.

Lásd még