Zdroj, obsah a datové soubory zdroje aplikací WPF

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.

  • Web souborů 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 lokalitu souborů původu však sestavení nemusí mít vůbec žádné znalosti nebo implicitní znalosti prostřednictvím odkazu URI (Uniform Resource Identifier) balíčku; není zaručeno, že odkazovaná lokalita souboru původu 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:

  • Po kompilaci do sestavení nemusíte aktualizovat obsah souboru prostředků.

  • 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 soubor prostředků soubor, který je 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 nastavení na Resource.

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

Použití souborů prostředků

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

Následující kód například ukazuje, jak načíst GetResourceStreamPage soubor prostředků a nastavit ho jako obsah (FramepageFrame):

// 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 objektu Stream, musíte provést další práci převodu na typ vlastnosti, se kterou ji nastavíte. Místo toho můžete WPF postarat o otevření a převod Stream souboru prostředků načtením souboru prostředků přímo do vlastnosti typu pomocí kódu.

Následující příklad ukazuje, jak načíst Page přímo do (FramepageFrame) 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ček 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:

V sadě Visual Studio přidáte nový Window, NavigationWindow, Page, FlowDocument, nebo ResourceDictionary do projektu, Build Action kód 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 za kódem, nezpracovaný XAML se zkompiluje do sestavení, nikoli do binární verze nezpracovaného XAML.

Soubory obsahu

Soubor obsahu se distribuuje jako volný soubor spolu se spustitelným sestavením. I když nejsou kompilovány do sestavení, sestavení se kompilují s metadaty, která vytváří přidružení ke každému souboru 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 CopyToOutputDirectory prvek metadat s Always hodnotou. V opačném případě můžete pomocí této hodnoty zajistit, aby se do výstupní složky PreserveNewest sestavení zkopírovala pouze nejnovější verze prostředku.

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 Contenta nastavíte ho Copy to Output DirectoryBuild Action na Copy always (stejné jakoAlways) a Copy if newer (stejné jakoPreserveNewest).

Při sestavení AssemblyAssociatedContentFileAttribute projektu se atribut 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í souborů obsahu

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. GetContentStreamStreamResourceInfo vrátí objekt, který zpřístupňuje soubor obsahu jako Stream a popisuje jeho typ obsahu.

Následující kód například ukazuje, jak načíst GetContentStreamPage soubor obsahu a nastavit ho jako obsah (FramepageFrame).

// 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 objektu Stream, musíte provést další práci převodu na typ vlastnosti, se kterou ji nastavíte. Místo toho můžete WPF postarat o otevření a převod Stream souboru prostředků načtením souboru prostředků přímo do vlastnosti typu pomocí kódu.

Následující příklad ukazuje, jak načíst Page přímo do (FramepageFrame) 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ček předchozího příkladu.

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

Web souborů původu

Soubory prostředků mají explicitní 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 neběží čas.

  • 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:/// ale http:// 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 web původních souborů.

Web souborů původu je jedinou možností pro aplikace s částečnou důvěryhodností, i když nejsou omezeny na částečné důvěryhodné aplikace. 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 použití webu s odkazem na původ jednodušší než použití file:///, protože použití file:/// vyžaduje, abyste soubor zpracovat celou cestu.

Poznámka:

Web souborů původu se neukládají do mezipaměti s aplikací prohlížeče XAML (XBAP) na klientském počítači, zatímco soubory obsahu jsou. 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 tak, aby se určilo, že lokalita zdrojového souboru se zkopíruje do umístění, které je relativní vzhledem k sestavení sestavení, 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:

V sadě Visual Studio vytvoříte web zdrojového souboru 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. GetRemoteStreamStreamResourceInfo vrátí objekt, který zveřejňuje web zdrojového souboru jako objekt a Stream popisuje jeho typ obsahu.

Následující kód například ukazuje, jak načíst GetRemoteStreamPage web zdrojového souboru a nastavit ho jako obsah (FramepageFrame).

// 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 objektu Stream, musíte provést další práci převodu na typ vlastnosti, se kterou ji nastavíte. Místo toho můžete WPF postarat o otevření a převod Stream souboru prostředků načtením souboru prostředků přímo do vlastnosti typu pomocí kódu.

Následující příklad ukazuje, jak načíst Page přímo do (FramepageFrame) 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ček 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é