Sdílet prostřednictvím


Prostředek aplikace WPF, obsah a datové soubory

Aplikace microsoft Windows často závisejí na souborech, které obsahují nespustitelná data, například XAML (Extensible Application Markup Language), obrázky, video a zvuk. Windows Presentation Foundation (WPF) nabízí zvláštní podporu pro konfiguraci, identifikaci a používání těchto typů datových souborů, které se nazývají datové soubory aplikace. Tato podpora se týká konkrétní sady datových typů aplikací, mezi které patří:

  • Soubory prostředků: Datové soubory kompilované do spustitelného souboru nebo sestavení WPF knihovny.

  • Soubory obsahu: Samostatné datové soubory, které mají explicitní přidružení ke spustitelnému sestavení WPF.

  • Soubory z místa původu: Samostatné datové soubory, které nemají přidružení ke spustitelnému sestavení WPF.

Jedním z důležitých rozdílů mezi těmito třemi typy souborů je, že soubory prostředků a soubory obsahu jsou známé v době sestavení; sestavení má o nich explicitní znalosti. Pro soubory původního místa však sestavení nemusí mít o nich vůbec žádné povědomí, nebo jen implicitní znalosti prostřednictvím odkazu na URI (identifikátor jednotného zdroje) balíčku; v případě právě tohoto odkazu není zaručeno, že odkazovaný soubor původního místa skutečně existuje.

Pro odkazování na datové soubory aplikací používá Windows Presentation Foundation (WPF) schéma identifikátoru URI (Uniform Resource Identifier), které je podrobně popsáno v identifikátorech URI balíčků wpF.

Toto téma popisuje, jak nakonfigurovat a používat datové soubory aplikace.

Soubory prostředků

Pokud musí být datový soubor aplikace vždy dostupný pro aplikaci, jediným způsobem, jak zaručit dostupnost, je zkompilovat ho do hlavního spustitelného sestavení aplikace nebo do některého z odkazovaných sestavení. Tento typ datového souboru aplikace se označuje jako soubor prostředků.

Soubory prostředků byste měli použít v případech, kdy:

  • Nemusíte aktualizovat obsah souboru prostředků poté, co je zkompilován do sestavení.

  • Chcete zjednodušit složitost distribuce aplikací snížením počtu závislostí souborů.

  • Datový soubor aplikace musí být lokalizovatelný (viz přehled globalizace a lokalizace WPF).

Poznámka:

Soubory prostředků popsané v této části se liší od souborů prostředků popsaných v prostředcích XAML a liší se od vložených nebo propojených prostředků popsaných v tématu Správa prostředků aplikace (.NET).

Konfigurace souborů prostředků

Ve WPF je prostředkový soubor součástí projektu Microsoft build engine (MSBuild) jako Resource položka.

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

Poznámka:

V sadě Visual Studio vytvoříte soubor prostředků přidáním souboru do projektu a nastavením jeho Build Action na Resource.

Při sestavení projektu nástroj MSBuild zkompiluje prostředek do sestavení.

Používání souborů prostředků

Pokud chcete načíst soubor prostředků, můžete volat GetResourceStream metodu třídy Application a předat URI balíčku, který identifikuje požadovaný soubor prostředků. GetResourceStream vrací objekt StreamResourceInfo, který zpřístupňuje soubor prostředků jako Stream a popisuje jeho typ obsahu.

Jako příklad následující kód ukazuje, jak použít GetResourceStream k načtení souboru prostředků Page a nastavit ho jako obsah Frame (pageFrame):

// 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

Při volání GetResourceStream získáte přístup k Stream, ale musíte provést další krok a převést ji na typ vlastnosti, kterou nastavíte. Místo toho můžete nechat WPF postarat se o otevření a převod souboru prostředků Stream načtením tohoto souboru přímo do vlastnosti typu pomocí kódu.

Následující příklad ukazuje, jak načíst Page přímo do Frame (pageFrame) pomocí kódu.

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

Následující příklad je ekvivalentem značkování předchozího příkladu.

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

Soubory kódu aplikace jako soubory prostředků

Na speciální sadu souborů kódu aplikace WPF lze odkazovat pomocí identifikátorů URI balíčků, včetně oken, stránek, dokumentů toku a slovníků prostředků. Vlastnost můžete například nastavit pomocí identifikátoru Application.StartupUri URI balíčku, který odkazuje na okno nebo stránku, kterou chcete načíst při spuštění aplikace.

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

Můžete to udělat, když je soubor XAML součástí projektu MSBuild jako Page položka.

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

Poznámka:

Ve Visual Studiu přidáte nový Window, NavigationWindow, Page, FlowDocument nebo ResourceDictionary do projektu, Build Action pro soubor značek bude výchozí.Page

Při kompilaci projektu s položkami Page se položky XAML převedou do binárního formátu a zkompilují se do přidruženého sestavení. V důsledku toho lze tyto soubory použít stejným způsobem jako typické soubory prostředků.

Poznámka:

Pokud je soubor XAML nakonfigurovaný jako Resource položka a neobsahuje soubor kódu na pozadí, surový XAML se zkompiluje do sestavení, nikoli do binární verze surového XAML.

Soubory obsahu

Soubor obsahu se distribuuje jako volný soubor spolu se spustitelným sestavením. Ačkoli samotné soubory obsahu nejsou kompilovány do sestavení, sestavení jsou kompilována s metadaty, která vytvářejí propojení s každým souborem obsahu.

Soubory obsahu byste měli použít v případě, že vaše aplikace vyžaduje konkrétní sadu datových souborů aplikace, které chcete aktualizovat, aniž byste znovu kompilovali sestavení, které je využívá.

Konfigurace souborů obsahu

Pokud chcete do projektu přidat soubor obsahu, musí být datový soubor aplikace zahrnutý jako Content položka. Vzhledem k tomu, že soubor obsahu není zkompilován přímo do sestavení, musíte nastavit element metadat MSBuild CopyToOutputDirectory k určení, že se soubor obsahu zkopíruje do umístění, které je relativní vzhledem k sestavené sestavení. Pokud chcete, aby se prostředek při každém sestavení projektu zkopíroval do výstupní složky sestavení, nastavte metadata CopyToOutputDirectory na hodnotu Always. V opačném případě můžete zajistit, aby se do výstupní složky sestavení zkopírovala pouze nejnovější verze prostředku tím, že použijete hodnotu PreserveNewest.

Následující příklad ukazuje soubor, který je nakonfigurovaný jako soubor obsahu, který se zkopíruje do výstupní složky sestavení pouze v případech, kdy je do projektu přidána nová verze zdroje.

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

Poznámka:

V sadě Visual Studio vytvoříte soubor obsahu tak, že do projektu přidáte soubor a nastavíte ho na Build Actiona nastavíte ho ContentCopy to Output Directory na Copy always (stejné jakoAlways) a Copy if newer (stejné jakoPreserveNewest).

Při sestavení projektu se atribut AssemblyAssociatedContentFileAttribute zkompiluje do metadat sestavení pro každý soubor obsahu.

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

Hodnota AssemblyAssociatedContentFileAttribute implikuje cestu k souboru obsahu vzhledem k jeho pozici v projektu. Pokud byl například soubor obsahu umístěn v podsložce projektu, další informace o cestě by byly začleněny do AssemblyAssociatedContentFileAttribute hodnoty.

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

Hodnota AssemblyAssociatedContentFileAttribute je také hodnota cesty k souboru obsahu ve výstupní složce sestavení.

Použití obsahových souborů

Chcete-li načíst soubor obsahu, můžete volat GetContentStream metodu Application třídy a předat identifikátor URI balíčku, který identifikuje požadovaný soubor obsahu. GetContentStream StreamResourceInfo vrátí objekt, který zpřístupňuje soubor obsahu jako Stream a popisuje jeho typ obsahu.

Například následující kód ukazuje, jak načíst obsahový soubor GetContentStream, a nastavit ho jako obsah Page (Frame).

// 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

Při volání GetContentStream získáte přístup k Stream, ale musíte provést další krok a převést ji na typ vlastnosti, kterou nastavíte. Místo toho můžete nechat WPF postarat se o otevření a převod souboru prostředků Stream načtením tohoto souboru přímo do vlastnosti typu pomocí kódu.

Následující příklad ukazuje, jak načíst Page přímo do Frame (pageFrame) pomocí kódu.

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

Následující příklad je ekvivalentem značkování předchozího příkladu.

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

Web souborů původu

Soubory prostředků mají zřejmý vztah se sestaveními, která jsou distribuována společně, jak je definuje AssemblyAssociatedContentFileAttribute. Někdy ale můžete chtít vytvořit implicitní nebo neexistující relaci mezi sestavením a datovým souborem aplikace, včetně těchto případů:

  • Soubor v době kompilace neexistuje.

  • Nevíte, jaké soubory bude sestavení vyžadovat, dokud nebude spuštěno.

  • Chcete mít možnost aktualizovat soubory bez opětovného zkompilování sestavení, ke kterému jsou přidruženy.

  • Vaše aplikace používá velké datové soubory, například zvuk a video, a chcete, aby si je uživatelé stáhli jenom v případě, že se rozhodnou.

Tyto typy souborů je možné načíst pomocí tradičních schémat identifikátorů URI, jako jsou schémata file:/// a http:// schémata.

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

Schémata file:/// i http:// ale vyžadují, aby vaše aplikace měla plnou důvěru. Pokud je vaše aplikace aplikací prohlížeče XAML (XBAP), která byla spuštěna z internetu nebo intranetu, a požaduje pouze sadu oprávnění, která jsou povolena pro aplikace spuštěné z těchto umístění, mohou být volné soubory načteny pouze z webu původu aplikace (umístění spuštění). Tyto soubory se označují jako soubory původního místa.

Soubory z místa původu jsou jedinou možností pro aplikace s částečnou důvěryhodností, neomezují se však pouze na aplikace s částečnou důvěryhodností. Aplikace s plnou důvěryhodností mohou stále potřebovat načíst datové soubory aplikací, o kterých v době sestavení neví; zatímco plně důvěryhodné aplikace mohou používat file:///, je pravděpodobné, že datové soubory aplikace budou nainstalovány ve stejné složce jako nebo podsložka sestavení aplikace. V tomto případě je odkazování na místo původu jednodušší než použití file:///, protože použití file:/// vyžaduje, abyste zpracovat celou cestu souboru.

Poznámka:

Soubory původu nejsou ukládány do mezipaměti s aplikací prohlížeče XAML (XBAP) na klientském počítači, zatímco soubory obsahu ano. V důsledku toho se stáhnou pouze v případě, že se výslovně požaduje. Pokud má aplikace prohlížeče XAML (XBAP) velké mediální soubory, jejich konfigurace jako web souborů původu znamená, že počáteční spuštění aplikace je mnohem rychlejší a soubory se stáhnou jenom na vyžádání.

Konfigurace lokality zdrojového souboru

Pokud web souborů původu neexistuje nebo není v době kompilace neznámý, je nutné použít tradiční mechanismy nasazení k zajištění dostupnosti požadovaných souborů za běhu, včetně použití programu příkazového XCopy řádku nebo Instalační služby systému Windows.

Pokud víte v době kompilace soubory, které chcete najít v lokalitě původu, ale přesto chcete zabránit explicitní závislosti, můžete tyto soubory přidat do projektu MSBuild jako None položku. Stejně jako u souborů obsahu musíte nastavit atribut MSBuild CopyToOutputDirectory, abyste určili, že zdrojový soubor se zkopíruje do umístění, které je relativní vzhledem k sestavenému sestavení, a to zadáním Always hodnoty nebo PreserveNewest hodnoty.

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

Poznámka:

Ve Visual Studiu vytvoříte soubor původu přidáním souboru do projektu a nastavením jeho Build Action na None.

Při sestavení projektu nástroj MSBuild zkopíruje zadané soubory do výstupní složky sestavení.

Použití webu se soubory původu

Pokud chcete načíst lokalitu zdrojového souboru, můžete volat GetRemoteStream metodu Application třídy a předat identifikátor URI balíčku, který identifikuje požadovanou lokalitu zdrojového souboru. GetRemoteStream vrátí objekt, který vystavuje soubor původního místa jako StreamResourceInfo a popisuje jeho typ obsahu.

Následující kód ukazuje jako příklad, jak použít GetRemoteStream k načtení souboru původu webu Page a nastavit ho jako obsah Frame (pageFrame).

// 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

Při volání GetRemoteStream získáte přístup k Stream, ale musíte provést další krok a převést ji na typ vlastnosti, kterou nastavíte. Místo toho můžete nechat WPF postarat se o otevření a převod souboru prostředků Stream načtením tohoto souboru přímo do vlastnosti typu pomocí kódu.

Následující příklad ukazuje, jak načíst Page přímo do Frame (pageFrame) pomocí kódu.

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

Následující příklad je ekvivalentem značkování předchozího příkladu.

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

Opětovné sestavení po změně typu sestavení

Po změně typu sestavení datového souboru aplikace je nutné znovu sestavit celou aplikaci, abyste zajistili, že se tyto změny použijí. Pokud sestavíte jenom aplikaci, změny se nepoužijí.

Viz také