Delen via


Pack-URI's in WPF

In Windows Presentation Foundation (WPF) worden uniform resource-id's (URI's) gebruikt om bestanden op veel manieren te identificeren en te laden, waaronder de volgende:

  • Geef de gebruikersinterface (UI) op die moet worden weergegeven wanneer een toepassing voor het eerst wordt gestart.

  • Afbeeldingen laden.

  • Navigeren naar pagina's.

  • Niet-uitvoerbare gegevensbestanden laden.

Bovendien kunnen URI's worden gebruikt om bestanden van verschillende locaties te identificeren en te laden, waaronder de volgende:

  • De huidige samenstelling.

  • Een assembly waarnaar wordt verwezen.

  • Een locatie ten opzichte van een samenstelling.

  • De locatie van oorsprong van de toepassing.

Om een consistent mechanisme te bieden voor het identificeren en laden van deze typen bestanden vanaf deze locaties, maakt WPF gebruik van de uitbreidbaarheid van het pack URI-schema. In dit onderwerp vindt u een overzicht van het schema, waarin wordt beschreven hoe u pack-URI's kunt maken voor verschillende scenario's, hoe u absolute en relatieve URI's en URI-resolutie kunt bespreken voordat wordt getoond hoe u pack-URI's gebruikt vanuit zowel markeringen als code.

Het Pack-URI-schema

Het pakket-URI-schema wordt gebruikt door de specificatie Open Packaging Conventions (OPC), waarin een model wordt beschreven voor het ordenen en identificeren van inhoud. De belangrijkste elementen van dit model zijn pakketten en onderdelen, waarbij een pakket een logische container is voor een of meer logische onderdelen. In de volgende afbeelding ziet u dit concept.

diagram pakket- en onderdelendiagram

Om onderdelen te identificeren, maakt de OPC-specificatie gebruik van de uitbreidbaarheid van RFC 2396 (Uniform Resource Identifiers (URI): Algemene syntaxis) om het pakket-URI-schema te definiëren.

Het schema dat door een URI wordt opgegeven, wordt gedefinieerd door het voorvoegsel; http, ftp en bestand zijn bekende voorbeelden. Het pack-URI-schema maakt gebruik van 'pack' als schema en bevat twee onderdelen: autoriteit en pad. Hier volgt de indeling voor een pack-URI.

pack://authority/pad

De autoriteit geeft het type pakket op waarmee een onderdeel is opgenomen, terwijl het pad de locatie van een onderdeel in een pakket specificeert.

Dit concept wordt geïllustreerd door de volgende afbeelding:

relatie tussen pakket, instantie en pad

Pakketten en onderdelen zijn vergelijkbaar met toepassingen en bestanden, waarbij een toepassing (pakket) een of meer bestanden (onderdelen) kan bevatten, waaronder:

  • Bronbestanden die zijn gecompileerd in de lokale assembly.

  • Bronbestanden die zijn gecompileerd in een assembly waarnaar wordt verwezen.

  • Bronbestanden die zijn gecompileerd in een refererende assembly.

  • Inhoudsbestanden.

  • Site van oorsprongsbestanden.

Voor toegang tot deze bestandstypen ondersteunt WPF twee autoriteiten: application:/// en siteoforigin:///. De application:/// instantie identificeert toepassingsgegevensbestanden die bekend zijn tijdens het compileren, waaronder bron- en inhoudsbestanden. De siteoforigin:/// instantie identificeert site van oorsprongsbestanden. Het bereik van elke instantie wordt weergegeven in de volgende afbeelding.

Pack URI-diagram

Notitie

Het autoriteitsonderdeel van een pack-URI is een ingesloten URI die verwijst naar een pakket en moet voldoen aan RFC 2396. Bovendien moet het streepje '/' worden vervangen door de komma ',' en gereserveerde tekens zoals '%' en '?' moeten geëscaped worden. Zie de OPC voor meer informatie.

In de volgende secties wordt uitgelegd hoe u pakket-URI's maakt met behulp van deze twee autoriteiten in combinatie met de juiste paden voor het identificeren van resources, inhoud en site van oorsprongsbestanden.

URI's van hulpbronbestandspakketten

Resourcebestanden worden geconfigureerd als MSBuild Resource items en worden gecompileerd in assembly's. WPF ondersteunt de constructie van pakket-URI's die kunnen worden gebruikt om bronbestanden te identificeren die zijn gecompileerd in de lokale assembly of gecompileerd in een assembly waarnaar wordt verwezen vanuit de lokale assembly.

Resourcebestand voor lokale samenstelling

De pack-URI voor een resourcebestand dat in de lokale assembly is gecompileerd, gebruikt de volgende authority en het volgende pad.

  • Autoriteit: application:///.

  • pad: de naam van het resourcebestand, inclusief het pad, ten opzichte van de hoofdmap van het lokale assemblyproject.

In het volgende voorbeeld ziet u de pack-URI voor een XAML-resourcebestand dat zich in de hoofdmap van de projectmap van de lokale assembly bevindt.

pack://application:,,,/ResourceFile.xaml

In het volgende voorbeeld ziet u de pack-URI voor een XAML-resourcebestand dat zich in een submap van de projectmap van de lokale assembly bevindt.

pack://application:,,,/Subfolder/ResourceFile.xaml

Resourcebestand van een assembly waarnaar wordt verwezen

De pack-URI voor een resourcebestand dat in een verwante assembly is gecompileerd, gebruikt de volgende autoriteit en het volgende pad:

  • Autoriteit: application:///.

  • Pad: de naam van een resourcebestand dat is gecompileerd in een assembly waarnaar verwezen wordt. Het pad moet voldoen aan de volgende indeling:

    AssemblyShortName{;Versie]{;PublicKey];component/Path

    • AssemblyShortName: de korte naam voor de assembly waarnaar wordt verwezen.

    • ; Versie [optioneel]: de versie van de assembly waarnaar wordt verwezen, die het resourcebestand bevat. Dit wordt gebruikt wanneer twee of meer assembly's met dezelfde korte naam worden geladen.

    • ;PublicKey [optioneel]: de openbare sleutel die is gebruikt voor het ondertekenen van de gerelateerde assembly. Dit wordt gebruikt wanneer twee of meerdere assemblies met dezelfde korte naam worden geladen.

    • ; onderdeel: geeft aan dat de assembly waarnaar wordt verwezen, wordt verwezen vanuit de lokale assembly.

    • /Path: de naam van het resourcebestand, inclusief het pad, ten opzichte van de hoofdmap van de projectmap van de assembly waarnaar wordt verwezen.

In het volgende voorbeeld ziet u de pack-URI voor een XAML-resourcebestand dat zich bevindt in de hoofdmap van de projectmap van de aangegeven assembly.

pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml

In het volgende voorbeeld ziet u de pack URI voor een XAML-resourcebestand dat zich in een submap van de projectmap van de assembly bevindt waarnaar wordt verwezen.

pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml

In het volgende voorbeeld ziet u de pack-URI voor een XAML-resourcebestand dat zich in de hoofdmap van de projectmap bevindt van een versie-specifieke assembly waarnaar wordt verwezen.

pack://application:,,,/ReferencedAssembly;v1.0.0.1;component/ResourceFile.xaml

Houd er rekening mee dat de syntaxis van de pack-URI voor resourcebestanden waarnaar wordt verwezen, alleen kan worden gebruikt met de application:///-instantie. Het volgende wordt bijvoorbeeld niet ondersteund in WPF.

pack://siteoforigin:,,,/SomeAssembly;component/ResourceFile.xaml

URI's van inhoudsbestandspakketten

De pack-URI voor een inhoudsbestand gebruikt de volgende autoriteit en het volgende pad.

  • Autoriteit: application:///.

  • pad: de naam van het inhoudsbestand, inclusief het pad ten opzichte van de bestandssysteemlocatie van de hoofduitvoerbare assembly van de applicatie.

In het volgende voorbeeld ziet u de pack-URI voor een XAML-inhoudsbestand, dat zich in dezelfde map bevindt als de uitvoerbare assembly.

pack://application:,,,/ContentFile.xaml

In het volgende voorbeeld ziet u de pack-URI voor een XAML-inhoudsbestand, dat zich in een submap bevindt die relatief is ten opzichte van de uitvoerbare assembly van de toepassing.

pack://application:,,,/Subfolder/ContentFile.xaml

Notitie

Html-inhoudsbestanden kunnen niet naartoe worden genavigeerd. Het URI-schema ondersteunt alleen navigatie naar HTML-bestanden die zich op de site van oorsprong bevinden.

Herkomstsite Pack-URIs

De pack-URI voor een oorsprongsbestandslocatie gebruikt de volgende authoriteit en het volgende pad:

  • Authority: siteoforigin:///.

  • pad: de naam van de locatie van het oorspronkelijke bestand, inclusief het pad ten opzichte van de locatie van waaruit de uitvoerbare assemblage werd gestart.

In het volgende voorbeeld ziet u de pack-URI voor een XAML-site van oorsprongsbestand, opgeslagen op de locatie waar de uitvoerbare assembly wordt gestart.

pack://siteoforigin:,,,/SiteOfOriginFile.xaml

In het volgende voorbeeld ziet u de pack-URI voor een XAML-bronbestand van de oorspronkelijke site, opgeslagen in de submap die in verhouding staat tot de locatie vanaf waar de uitvoerbare assembly van de toepassing wordt gestart.

pack://siteoforigin:,,,/Subfolder/SiteOfOriginFile.xaml

Paginabestanden

XAML-bestanden die zijn geconfigureerd als MSBuild Page items worden gecompileerd in assembly's op dezelfde manier als resourcebestanden. Daarom kunnen MSBuild Page items worden geïdentificeerd met behulp van pack-URI's voor resourcebestanden.

De typen XAML-bestanden die doorgaans zijn geconfigureerd als MSBuildPage items hebben een van de volgende als hoofdelement:

Absolute versus relatieve Pack-URIs

Een volledig gekwalificeerde pack-URI omvat het schema, de autoriteit en het pad en wordt beschouwd als een absolute pack-URI. Als vereenvoudiging voor ontwikkelaars kunt u met XAML-elementen doorgaans de juiste kenmerken instellen met een relatieve pack-URI, die alleen het pad bevat.

Denk bijvoorbeeld aan de volgende absolute pack-URI voor een resourcebestand in de lokale assembly.

pack://application:,,,/ResourceFile.xaml

De relatieve pack-URI die naar dit resourcebestand verwijst, is het volgende.

/ResourceFile.xaml

Notitie

Omdat site-of-origin-bestanden niet zijn gekoppeld aan assembly's, kunnen ze alleen worden verwezen met absolute pack-URI's.

Bij standaardinstellingen wordt een relatieve pack-URI beschouwd als relatief ten opzichte van de locatie van de markup of de code die de verwijzing bevat. Als er echter een voorloopbackslash wordt gebruikt, wordt de relatieve URI-verwijzing van het pakket beschouwd als relatief ten opzichte van de root van de toepassing. Denk bijvoorbeeld aan de volgende projectstructuur.

App.xaml

Page2.xaml

\SubFolder

+ Page1.xaml

+ Page2.xaml

Als Page1.xaml een URI bevat die verwijst naar Root\Submap\Page2.xaml, kan de verwijzing de volgende relatieve pakket-URI gebruiken.

Page2.xaml

Als Page1.xaml een URI bevat die verwijst naar Root\Page2.xaml, kan de verwijzing de volgende relatieve pakket-URI gebruiken.

/Page2.xaml

URI-resolutie van Pack

De indeling van pack-URI's maakt het mogelijk voor pack-URI's voor verschillende typen bestanden om er hetzelfde uit te zien. Denk bijvoorbeeld aan de volgende absolute pack-URI.

pack://application:,,,/ResourceOrContentFile.xaml

Deze absolute pack-URI kan verwijzen naar een resourcebestand in de lokale assembly of een inhoudsbestand. Hetzelfde geldt voor de volgende relatieve URI.

/ResourceOrContentFile.xaml

Om het type bestand te bepalen waarnaar een pack-URI verwijst, worden de URI's voor resourcebestanden in lokale assembly's en contentbestanden opgelost met behulp van de volgende heuristieken:

  1. Test de assemblymetagegevens voor een AssemblyAssociatedContentFileAttribute kenmerk dat overeenkomt met de pack-URI.

  2. Als het kenmerk AssemblyAssociatedContentFileAttribute wordt gevonden, verwijst het pad van de pack-URI naar een inhoudsbestand.

  3. Als het kenmerk AssemblyAssociatedContentFileAttribute niet wordt gevonden, onderzoekt u de set van resourcebestanden die zijn gecompileerd in de lokale assembly.

  4. Als een resourcebestand dat overeenkomt met het pad van de pack-URI wordt gevonden, verwijst het pad van de pack-URI naar een resourcebestand.

  5. Als de resource niet wordt gevonden, is de intern gemaakte Uri ongeldig.

URI-omzetting is niet van toepassing op URI's die naar het volgende verwijzen:

  • Inhoudsbestanden in assemblies waarnaar wordt verwezen: deze bestandstypen worden niet door WPF ondersteund.

  • Ingesloten bestanden in assembly's waarnaar wordt verwezen: URI's die deze identificeren, zijn uniek omdat ze zowel de naam van de assembly waarnaar wordt verwezen als het achtervoegsel ;component bevatten.

  • Site van oorsprongsbestanden: URI's die ze identificeren, zijn uniek omdat ze de enige bestanden zijn die kunnen worden geïdentificeerd door pack-URI's die de siteoforigin:/// autoriteit bevatten.

Een vereenvoudiging die de resolutie van pack-URI's mogelijk maakt, is dat code enigszins onafhankelijk kan zijn van de locaties van resource- en inhoudsbestanden. Als u bijvoorbeeld een resourcebestand in de lokale assembly hebt dat opnieuw is geconfigureerd als een inhoudsbestand, blijft de pakket-URI voor de resource hetzelfde, net zoals de code die gebruikmaakt van de pack-URI.

Programmeren met Pack-URI's

Veel WPF-klassen implementeren eigenschappen die kunnen worden ingesteld met pack-URI's, waaronder:

Deze eigenschappen kunnen worden ingesteld vanuit zowel markeringen als code. In deze sectie ziet u de basisconstructies voor beide en ziet u vervolgens voorbeelden van veelvoorkomende scenario's.

Pack-URI's gebruiken in Markeringen

Een pack-URI wordt opgegeven in markeringen door het element van een kenmerk in te stellen met de pack-URI. Bijvoorbeeld:

<element attribute="pack://application:,,,/File.xaml" />

In tabel 1 ziet u de verschillende absolute pack-URI's die u in markeringen kunt opgeven.

Tabel 1: Absolute Pack-URI's in opmaak

Bestand Absolute pack-URI
Resourcebestand - lokale samenstelling "pack://application:,,,/ResourceFile.xaml"
Resourcebestand in submap - lokale samenstelling "pack://application:,,,/Subfolder/ResourceFile.xaml"
Resourcebestand - de assembly waarnaar wordt verwezen "pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml"
Resourcebestand in submap van de gerefereerde assembly "pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml"
Resourcebestand in een geversiede assembly waarnaar wordt verwezen "pack://application:,,,/ReferencedAssembly;v1.0.0.0;component/ResourceFile.xaml"
Inhoudsbestand "pack://application:,,,/ContentFile.xaml"
Inhoudsbestand in submap "pack://application:,,,/Subfolder/ContentFile.xaml"
Site van oorsprongsbestand "pack://siteoforigin:,,,/SOOFile.xaml"
Locatie van het oorsprongsbestand in submap "pack://siteoforigin:,,,/Subfolder/SOOFile.xaml"

In tabel 2 ziet u de verschillende relatieve pakket-URI's die u in markeringen kunt opgeven.

Tabel 2: Relatieve pack URI's in markup

Bestand Relatieve pakket-URI
Het resourcebestand in de lokale assembly "/ResourceFile.xaml"
Resourcebestand in submap van lokale assembly "/Subfolder/ResourceFile.xaml"
Resourcebestand in de assembly waarnaar wordt verwezen "/ReferencedAssembly;component/ResourceFile.xaml"
Resourcebestand in submap van assembly waarnaar wordt verwezen "/ReferencedAssembly;component/Subfolder/ResourceFile.xaml"
Inhoudsbestand "/ContentFile.xaml"
Inhoudsbestand in submap "/Subfolder/ContentFile.xaml"

Pack-URI's gebruiken in code

U geeft een pack-URI in code op door de Uri klasse te instantiëren en de pack-URI als parameter door te geven aan de constructor. Dit wordt gedemonstreerd in het volgende voorbeeld.

Uri uri = new Uri("pack://application:,,,/File.xaml");

Standaard beschouwt de Uri klasse pack-URI's als absoluut. Er wordt dus een uitzondering gegenereerd wanneer een exemplaar van de Uri-klasse wordt gemaakt met een relatieve pack-URI.

Uri uri = new Uri("/File.xaml");

Gelukkig accepteert de Uri(String, UriKind) overbelasting van de Uri klasseconstructor een parameter van het type UriKind waarmee u kunt opgeven of een pack-URI absoluut of relatief is.

// Absolute URI (default)
Uri absoluteUri = new Uri("pack://application:,,,/File.xaml", UriKind.Absolute);
// Relative URI
Uri relativeUri = new Uri("/File.xaml",
                        UriKind.Relative);

U moet alleen Absolute of Relative opgeven wanneer u zeker weet dat de opgegeven pack-URI een of de andere is. Als u niet weet welk type pack-URI wordt gebruikt, bijvoorbeeld wanneer een gebruiker tijdens runtime een pack-URI invoert, gebruikt u in plaats daarvan RelativeOrAbsolute.

// Relative or Absolute URI provided by user via a text box
TextBox userProvidedUriTextBox = new TextBox();
Uri uri = new Uri(userProvidedUriTextBox.Text, UriKind.RelativeOrAbsolute);

Tabel 3 illustreert de verschillende relatieve pakket-URI's die u in code kunt opgeven met behulp van System.Uri.

Tabel 3: Absolute pack-URI's in code

Bestand Absolute pack-URI
Resourcebestand - lokale samenstelling Uri uri = new Uri("pack://application:,,,/ResourceFile.xaml", UriKind.Absolute);
Resourcebestand in submap - lokale assembly Uri uri = new Uri("pack://application:,,,/Subfolder/ResourceFile.xaml", UriKind.Absolute);
Resourcebestand - assembly waarnaar wordt verwezen Uri uri = new Uri("pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml", UriKind.Absolute);
Resourcebestand in submap van assembly waarnaar wordt verwezen Uri uri = new Uri("pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml", UriKind.Absolute);
Resourcebestand in een geversioneerde assembly waarnaar wordt verwezen Uri uri = new Uri("pack://application:,,,/ReferencedAssembly;v1.0.0.0;component/ResourceFile.xaml", UriKind.Absolute);
Inhoudsbestand Uri uri = new Uri("pack://application:,,,/ContentFile.xaml", UriKind.Absolute);
Inhoudsbestand in submap Uri uri = new Uri("pack://application:,,,/Subfolder/ContentFile.xaml", UriKind.Absolute);
Site van oorsprongsbestand Uri uri = new Uri("pack://siteoforigin:,,,/SOOFile.xaml", UriKind.Absolute);
Locatie van oorsprongsbestand in submap Uri uri = new Uri("pack://siteoforigin:,,,/Subfolder/SOOFile.xaml", UriKind.Absolute);

Tabel 4 illustreert de verschillende relatieve pakket-URI's die u in code kunt opgeven met behulp van System.Uri.

Tabel 4: Relatieve Pack-URI's in code

Bestand Relatieve pakket-URI
Resourcebestand - lokale samenstelling Uri uri = new Uri("/ResourceFile.xaml", UriKind.Relative);
Resourcebestand in submap - lokale assemblage Uri uri = new Uri("/Subfolder/ResourceFile.xaml", UriKind.Relative);
Resourcebestand - assembly waarnaar wordt verwezen Uri uri = new Uri("/ReferencedAssembly;component/ResourceFile.xaml", UriKind.Relative);
Resourcebestand in submap - assembly waarnaar wordt verwezen Uri uri = new Uri("/ReferencedAssembly;component/Subfolder/ResourceFile.xaml", UriKind.Relative);
Inhoudsbestand Uri uri = new Uri("/ContentFile.xaml", UriKind.Relative);
Inhoudsbestand in submap Uri uri = new Uri("/Subfolder/ContentFile.xaml", UriKind.Relative);

Veelvoorkomende Pack-URI-scenario's

In de voorgaande secties is besproken hoe u pakket-URI's kunt maken om resources, inhoud en site van oorsprongsbestanden te identificeren. In WPF worden deze constructies op verschillende manieren gebruikt en de volgende secties hebben betrekking op verschillende algemene gebruiksgegevens.

De gebruikersinterface opgeven die moet worden weergegeven wanneer een toepassing wordt gestart

StartupUri geeft de eerste gebruikersinterface op die moet worden weergegeven wanneer een WPF-toepassing wordt gestart. Voor zelfstandige toepassingen kan de gebruikersinterface een venster zijn, zoals wordt weergegeven in het volgende voorbeeld.

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

Zelfstandige toepassingen en XAML-browsertoepassingen (XBAPs) kunnen ook een pagina opgeven als de eerste gebruikersinterface, zoals wordt weergegeven in het volgende voorbeeld.

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

Als de toepassing een zelfstandige toepassing is en er een pagina met StartupUriwordt opgegeven, opent WPF een NavigationWindow om de pagina te hosten. Voor XBAPs wordt de pagina weergegeven in de hostbrowser.

In het volgende voorbeeld ziet u hoe u naar een pagina navigeert.

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  WindowTitle="Page With Hyperlink"
  WindowWidth="250"
  WindowHeight="250">
<Hyperlink NavigateUri="UriOfPageToNavigateTo.xaml">
  Navigate to Another Page
</Hyperlink>
</Page>

Zie Navigatieoverzichtvoor meer informatie over de verschillende manieren om in WPF te navigeren.

Een vensterpictogram opgeven

In het volgende voorbeeld ziet u hoe u een URI gebruikt om het pictogram van een venster op te geven.

<Window
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.MainWindow"
    Icon="WPFIcon1.ico">
</Window>

Zie Iconvoor meer informatie.

Afbeeldings-, audio- en videobestanden laden

MET WPF kunnen toepassingen een breed scala aan mediatypen gebruiken, die allemaal kunnen worden geïdentificeerd en geladen met pack-URI's, zoals wordt weergegeven in de volgende voorbeelden.

<MediaElement Stretch="Fill" LoadedBehavior="Play" Source="pack://siteoforigin:,,,/Media/bee.wmv" />
<MediaElement Stretch="Fill" LoadedBehavior="Play" Source="pack://siteoforigin:,,,/Media/ringin.wav" />
<Image Source="Images/Watermark.png" />

Zie Graphics and Multimediavoor meer informatie over het werken met media-inhoud.

Een resourcewoordenlijst laden vanaf de site van oorsprong

Resourcewoordenlijsten (ResourceDictionary) kunnen worden gebruikt om toepassingsthema's te ondersteunen. Een manier om thema's te maken en te beheren, is door meerdere thema's te maken als resourcewoordenlijsten die zich op de site van oorsprong van een toepassing bevinden. Hierdoor kunnen thema's worden toegevoegd en bijgewerkt zonder een toepassing opnieuw te compileren en opnieuw te implementeren. Deze resourcewoordenlijsten kunnen worden geïdentificeerd en geladen met behulp van pack-URI's, die worden weergegeven in het volgende voorbeeld.

<Application
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    StartupUri="HomePage.xaml">
  <Application.Resources>
    <ResourceDictionary Source="pack://siteoforigin:,,,/PageTheme.xaml" />
  </Application.Resources>
</Application>

Zie Styling and Templatingvoor een overzicht van thema's in WPF.

Zie ook