URI di tipo pack in WPF
In Windows Presentation Foundation (WPF), gli uniform resource identifiers (URIs) vengono utilizzati per identificare e caricare file in diversi modi, inclusi i seguenti:
Specificando l'user interface (UI) da visualizzare al primo avvio di un'applicazione.
Caricando immagini.
Spostandosi sulle pagine.
Caricando file di dati non eseguibili.
Inoltre, gli URIs possono essere utilizzati per identificare e caricare file da diversi percorsi, inclusi i seguenti:
L'assembly corrente.
Un assembly a cui si fa riferimento.
Un percorso relativo a un assembly.
Il sito di origine dell'applicazione.
Per fornire un meccanismo coerente di identificazione e caricamento di questi tipi di file dai diversi percorsi, WPF sfrutta l'estensibilità dello schema URI di tipo pack. In questo argomento vengono fornite informazioni preliminari sullo schema, viene illustrato come costruire URIs di tipo pack per diversi scenari, vengono trattati gli URIs assoluti e relativi nonché la risoluzione degli URI, fino a illustrare come utilizzare gli URIs di tipo pack dal markup e dal codice.
Nel presente argomento sono contenute le seguenti sezioni.
- Schema URI di tipo pack
- URI di tipo pack per i file di risorse
- URI di tipo pack per i file di dati
- URI di tipo pack per il sito di origine
- File di paging
- URI di tipo pack assolutie relativi
- Risoluzione degli URI di tipo pack
- Programmazione con URI di tipo pack
- Argomenti correlati
Schema URI di tipo pack
Lo schema URI di tipo pack viene utilizzato dalla specifica Open Packaging Conventions (OPC) (la pagina potrebbe essere in inglese), che descrive un modello di organizzazione e identificazione del contenuto. Gli elementi principali di questo modello sono i package e le parti, dove un package è un contenitore logico per una o più parti logiche. Nella figura che segue viene illustrato questo concetto.
Per identificare le parti, la specifica OPC sfrutta l'estensibilità dello standard RFC 2396 (Uniform Resource Identifier (URI): Generic Syntax) per definire lo schema URI di tipo pack.
Lo schema specificato da un URI è definito dal prefisso; http, ftp e file sono esempi noti. Lo schema URI di tipo pack utilizza "pack" come schema e contiene due componenti: autorità e percorso. Di seguito viene riportato il formato di un URI di tipo pack.
pack://autorità/percorso
L'autorità specifica il tipo di package in cui è contenuta una parte, mentre il percorso specifica il percorso di una parte all'interno di un package.
Il concetto è illustrato nella figura che segue:
Package e parti possono essere paragonati ad applicazioni e file, dove un'applicazione (package) può includere uno o più file (parti), inclusi:
File di risorse compilati nell'assembly locale.
File di risorse compilati in un assembly a cui si fa riferimento.
File di risorse compilati in un assembly contenente un riferimento.
File di dati.
File del sito di origine.
Per l'accesso a questi tipi di file, WPF supporta due autorità: application:/// e siteoforigin:///. L'autorità application:/// identifica i file di dati dell'applicazione noti in fase di compilazione, inclusi i file di risorse e i file di dati. L'autorità siteoforigin:/// identifica i file del sito di origine. Nella figura che segue viene illustrato l'ambito di ciascuna autorità.
Nota |
---|
Il componente autorità di un URI di tipo pack è un URI incorporato che punta a un package e deve essere conforme allo standard RFC 2396.Inoltre, il carattere "/" deve essere sostituito con il carattere "," e i caratteri riservati quali "%" e "?" devono essere di tipo escape.Vedere la specifica OPC per i dettagli. |
Nelle sezioni seguenti viene illustrato come costruire URIs di tipo pack utilizzando queste due autorità insieme ai percorsi appropriati per l'identificazione dei file di risorse, di dati e del sito di origine.
URI di tipo pack per i file di risorse
I file di risorse vengono configurati come elementi MSBuild Resource e compilati all'interno di assembly. WPF supporta la costruzione di URIs di tipo pack utilizzabili per identificare i file di risorse compilati nell'assembly locale o in un assembly a cui si fa riferimento dall'assembly locale.
File di risorse dell'assembly locale
L'URI di tipo pack per un file di risorse compilato nell'assembly locale utilizza l'autorità e il percorso seguenti:
Autorità: application:///.
Percorso: il nome del file di risorse, incluso il percorso relativo alla radice della cartella del progetto dell'assembly locale.
Nell'esempio seguente viene illustrato l'URI di tipo pack per un file di risorse XAML situato nella radice della cartella del progetto dell'assembly locale.
pack://application:,,,/ResourceFile.xaml
Nell'esempio seguente viene illustrato l'URI di tipo pack per un file di risorse XAML situato in una sottocartella della cartella del progetto dell'assembly locale.
pack://application:,,,/Subfolder/ResourceFile.xaml
File di risorse dell'assembly a cui si fa riferimento
L'URI di tipo pack per un file di risorse compilato in un assembly a cui si fa riferimento utilizza l'autorità e il percorso seguenti:
Autorità: application:///.
Percorso: il nome di un file di risorse compilato in un assembly a cui si fa riferimento. Il percorso deve rispettare il formato seguente:
NomeBreveAssembly[;Versione][;ChiavePubblica];component/Percorso
NomeBreveAssembly: nome breve dell'assembly a cui si fa riferimento.
;Versione [facoltativo]: versione dell'assembly a cui si fa riferimento contenente il file di risorse. Viene utilizzato in caso di caricamento di due o più assembly a cui si fa riferimento aventi lo stesso nome breve.
;ChiavePubblica [facoltativo]: chiave pubblica utilizzata per firmare l'assembly a cui si fa riferimento. Viene utilizzato in caso di caricamento di due o più assembly a cui si fa riferimento aventi lo stesso nome breve.
;component: specifica che il riferimento all'assembly avviene dall'assembly locale.
/Percorso: nome del file di risorse, incluso il percorso relativo alla radice della cartella del progetto dell'assembly a cui si fa riferimento.
Nell'esempio seguente viene illustrato l'URI di tipo pack per un file di risorse XAML situato nella radice della cartella del progetto dell'assembly a cui si fa riferimento.
pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml
Nell'esempio seguente viene illustrato l'URI di tipo pack per un file di risorse XAML situato in una sottocartella della cartella del progetto dell'assembly a cui si fa riferimento.
pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml
Nell'esempio seguente viene illustrato l'URI di tipo pack per un file di risorse XAML situato nella cartella radice della cartella del progetto di un assembly specifico della versione, a cui si fa riferimento.
pack://application:,,,/ReferencedAssembly;v1.0.0.1;component/ResourceFile.xaml
La sintassi dell'URI di tipo pack per i file di risorse dell'assembly a cui si fa riferimento può essere utilizzata soltanto con l'autorità application:///. L'utilizzo di un'autorità diversa, come nell'esempio che segue, non è supportato in WPF.
pack://siteoforigin:,,,/SomeAssembly;component/ResourceFile.xaml
URI di tipo pack per i file di dati
L'URI di tipo pack per un file di dati utilizza l'autorità e il percorso seguenti:
Autorità: application:///.
Percorso: nome del file di dati, incluso il percorso relativo al file system dell'assembly eseguibile principale dell'applicazione.
Nell'esempio seguente viene illustrato l'URI di tipo pack per un file di dati XAML, situato nella stessa cartella dell'assembly eseguibile.
pack://application:,,,/ContentFile.xaml
Nell'esempio seguente viene illustrato l'URI di tipo pack per un file di dati XAML, situato in una sottocartella relativa all'assembly eseguibile dell'applicazione.
pack://application:,,,/Subfolder/ContentFile.xaml
Nota |
---|
Non è possibile spostarsi su file di dati HTML.Lo schema URI supporta unicamente lo spostamento su file HTML che si trovano nel sito di origine. |
URI di tipo pack per il sito di origine
L'URI di tipo pack per un file del sito di origine utilizza l'autorità e il percorso seguenti:
Autorità: siteoforigin:///.
Percorso: nome del file del sito di origine, incluso il percorso da cui è stato avviato l'assembly eseguibile.
Nell'esempio seguente viene illustrato l'URI di tipo pack per un file del sito di origine XAML, archiviato nel percorso dal quale viene avviato l'assembly eseguibile.
pack://siteoforigin:,,,/SiteOfOriginFile.xaml
Nell'esempio seguente viene illustrato l'URI di tipo pack per un file del sito di origine XAML, archiviato in una sottocartella relativa al percorso dal quale viene avviato l'assembly eseguibile dell'applicazione.
pack://siteoforigin:,,,/Subfolder/SiteOfOriginFile.xaml
File di paging
I file XAML configurati come elementi Page MSBuild vengono compilati all'interno di assembly, esattamente come avviene per i file di risorse. Di conseguenza, gli elementi Page MSBuild possono essere identificati mediante gli URIs di tipo pack per i file di risorse.
I tipi di file XAML comunemente configurati come elementi Page MSBuild possiedono uno dei seguenti elementi radice:
URI di tipo pack assolutie relativi
Un URI di tipo pack completo include lo schema, l'autorità e il percorso e viene considerato un URI di tipo pack assoluto. Per semplificare il lavoro degli sviluppatori, gli elementi XAML consentono in genere di impostare gli attributi appropriati con un URI di tipo pack relativo, il quale include soltanto il percorso.
Ad esempio, si consideri il seguente URI di tipo pack assoluto per un file di risorse nell'assembly locale.
pack://application:,,,/ResourceFile.xaml
L'URI di tipo pack relativo che fa riferimento a questo file di risorse sarebbe il seguente.
/ResourceFile.xaml
Nota |
---|
Dal momento che i file del sito di origine non sono associati agli assembly, è possibile farvi riferimento soltanto mediante URIs di tipo pack assoluti. |
Per impostazione predefinita, un URI di tipo pack relativo è considerato relativo al percorso del markup o del codice contenente il riferimento. In caso di utilizzo di una barra rovesciata iniziale, tuttavia, il riferimento dell'URI di tipo pack relativo viene considerato relativo alla radice dell'applicazione. Si consideri ad esempio la seguente struttura del progetto.
App.xaml
Page2.xaml
\SubFolder
+ Page1.xaml
+ Page2.xaml
Se Page1.xaml contiene un URI che fa riferimento a Radice\SubFolder\Page2.xaml, il riferimento può utilizzare l'URI di tipo pack relativo che segue.
Page2.xaml
Se Page1.xaml contiene un URI che fa riferimento a Radice\Page2.xaml, il riferimento può utilizzare l'URI di tipo pack relativo che segue.
/Page2.xaml
Risoluzione degli URI di tipo pack
Il formato degli URIs di tipo pack è tale da conferire lo stesso aspetto a URIs per tipi di file diversi. Si consideri ad esempio il seguente URI di tipo pack assoluto.
pack://application:,,,/ResourceOrContentFile.xaml
Questo URI potrebbe fare riferimento a un file di risorse nell'assembly locale o a un file di dati. Lo stesso vale per il seguente URI relativo.
/ResourceOrContentFile.xaml
Per determinare il tipo di file al quale un URI di tipo pack fa riferimento, WPF risolve gli URIs per i file di risorse negli assembly locali e per i file di dati mediante la seguente euristica:
Ricercare nei metadati dell'assembly un attributo AssemblyAssociatedContentFileAttribute che corrisponda all'URI di tipo pack.
Se l'attributo AssemblyAssociatedContentFileAttribute viene trovato, il percorso dell'URI di tipo pack fa riferimento a un file di dati.
Se l'attributo AssemblyAssociatedContentFileAttribute non viene trovato, ricercare nei file di risorse fissi compilati nell'assembly locale.
Se viene trovato un file di risorse corrispondente al percorso dell'URI di tipo pack, allora il percorso dell'URI fa riferimento a un file di risorse.
Se la risorsa non viene trovata, l'oggetto Uri internamente creato non è valido.
La risoluzione degli URI non viene applicata agli URIs che fanno riferimento a quanto segue:
File di dati negli assembly a cui si fa riferimento: questi tipi di file non sono supportati da WPF.
File incorporati negli assembly a cui si fa riferimento: gli URIs che li identificano sono univoci in quanto includono sia il nome dell'assembly in questione sia il suffisso ;component.
File del sito di origine: gli URIs che li identificano sono univoci in quanto sono gli unici file identificabili dagli URIs di tipo pack contenenti l'autorità siteoforigin:///.
La risoluzione degli URI di tipo pack consente al codice di essere indipendente dai percorsi dei file di risorse e dei file di dati. Ad esempio, se un file di risorse nell'assembly locale viene riconfigurato come file di dati, l'URI di tipo pack per la risorsa rimane lo stesso, come anche il codice che utilizza tale URI.
Programmazione con URI di tipo pack
Molte classi WPF implementano proprietà che possono essere impostate con URIs di tipo pack, tra cui:
Queste proprietà possono essere impostate sia dal markup che dal codice. In questa sezione vengono illustrate le costruzioni di base per entrambi, quindi vengono riportati alcuni esempi di scenari comuni.
Utilizzo degli URI di tipo pack nel markup
Un URI di tipo pack viene specificato nel markup impostando l'elemento di un attributo con l'URI in questione. Di seguito è riportato un esempio:
<element attribute="pack://application:,,,/File.xaml" />
Nella Tabella 1 sono illustrati i vari URIs di tipo pack assoluti che è possibile specificare nel markup.
Tabella 1: URI di tipo pack assoluti nel markup
File |
URI di tipo pack assoluto |
---|---|
File di risorse - assembly locale |
"pack://application:,,,/ResourceFile.xaml" |
File di risorse in una sottocartella - assembly locale |
"pack://application:,,,/Subfolder/ResourceFile.xaml" |
File di risorse - assembly a cui si fa riferimento |
"pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml" |
File di risorse in una sottocartella dell'assembly a cui si fa riferimento |
"pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml" |
File di risorse nell'assembly con versione a cui si fa riferimento |
"pack://application:,,,/ReferencedAssembly;v1.0.0.0;component/ResourceFile.xaml" |
File di dati |
"pack://application:,,,/ContentFile.xaml" |
File di dati in una sottocartella |
"pack://application:,,,/Subfolder/ContentFile.xaml" |
File del sito di origine |
"pack://siteoforigin:,,,/SOOFile.xaml" |
File del sito di origine in una sottocartella |
"pack://siteoforigin:,,,/Subfolder/SOOFile.xaml" |
Nella Tabella 2 sono illustrati i vari URIs di tipo pack relativi che è possibile specificare nel markup.
Tabella 2: URI di tipo pack relativi nel markup
File |
URI di tipo pack relativo |
---|---|
File di risorse nell'assembly locale |
"/ResourceFile.xaml" |
File di risorse in una sottocartella dell'assembly locale |
"/Subfolder/ResourceFile.xaml" |
File di risorse nell'assembly a cui si fa riferimento |
"/ReferencedAssembly;component/ResourceFile.xaml" |
File di risorse in una sottocartella dell'assembly a cui si fa riferimento |
"/ReferencedAssembly;component/Subfolder/ResourceFile.xaml" |
File di dati |
"/ContentFile.xaml" |
File di dati in una sottocartella |
"/Subfolder/ContentFile.xaml" |
Utilizzo degli URI di tipo pack nel codice
Per specificare un URI di tipo pack nel codice, creare un'istanza della classe Uri e passare l'URI al costruttore sotto forma di parametro, come illustrato nell'esempio riportato di seguito.
Uri uri = new Uri("pack://application:,,,/File.xaml");
Per impostazione predefinita, la classe Uri considera gli URIs di tipo pack come assoluti. Di conseguenza, quando si crea un'istanza della classe Uri con un URI di tipo pack relativo viene generata un'eccezione.
Uri uri = new Uri("/File.xaml");
Fortunatamente l'overload Uri(String, UriKind) del costruttore della classe Uri accetta un parametro di tipo UriKind che consente di specificare se un URI di tipo pack è assoluto o relativo.
// Absolute URI (default)
Uri absoluteUri = new Uri("pack://application:,,,/File.xaml", UriKind.Absolute);
// Relative URI
Uri relativeUri = new Uri("/File.xaml", UriKind.Relative);
Quando si è certi che l'URI di tipo pack fornito sia assoluto o relativo, sarebbe opportuno specificare unicamente Absolute o Relative, a seconda del caso. Se invece non si conosce il tipo di URI utilizzato, ad esempio quando un utente immette un URI di tipo pack in fase di esecuzione, utilizzare RelativeOrAbsolute.
// Relative or Absolute URI provided by user via a text box
TextBox userProvidedUriTextBox = new TextBox();
Uri uri = new Uri(userProvidedUriTextBox.Text, UriKind.RelativeOrAbsolute);
Nella Tabella 3 sono illustrati i vari URIs di tipo pack assoluti che è possibile specificare nel codice utilizzando System.Uri.
Tabella 3: URI di tipo pack assoluti nel codice
File |
URI di tipo pack assoluto |
---|---|
File di risorse - assembly locale |
Uri uri = new Uri("pack://application:,,,/ResourceFile.xaml", UriKind.Absolute); |
File di risorse in una sottocartella - assembly locale |
Uri uri = new Uri("pack://application:,,,/Subfolder/ResourceFile.xaml", UriKind.Absolute); |
File di risorse - assembly a cui si fa riferimento |
Uri uri = new Uri("pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml", UriKind.Absolute); |
File di risorse in una sottocartella dell'assembly a cui si fa riferimento |
Uri uri = new Uri("pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml", UriKind.Absolute); |
File di risorse nell'assembly con versione a cui si fa riferimento |
Uri uri = new Uri("pack://application:,,,/ReferencedAssembly;v1.0.0.0;component/ResourceFile.xaml", UriKind.Absolute); |
File di dati |
Uri uri = new Uri("pack://application:,,,/ContentFile.xaml", UriKind.Absolute); |
File di dati in una sottocartella |
Uri uri = new Uri("pack://application:,,,/Subfolder/ContentFile.xaml", UriKind.Absolute); |
File del sito di origine |
Uri uri = new Uri("pack://siteoforigin:,,,/SOOFile.xaml", UriKind.Absolute); |
File del sito di origine in una sottocartella |
Uri uri = new Uri("pack://siteoforigin:,,,/Subfolder/SOOFile.xaml", UriKind.Absolute); |
Nella Tabella 4 sono illustrati i vari URIs di tipo pack relativi che è possibile specificare nel codice utilizzando System.Uri.
Tabella 4: URI di tipo pack relativi nel codice
File |
URI di tipo pack relativo |
---|---|
File di risorse - assembly locale |
Uri uri = new Uri("/ResourceFile.xaml", UriKind.Relative); |
File di risorse in una sottocartella - assembly locale |
Uri uri = new Uri("/Subfolder/ResourceFile.xaml", UriKind.Relative); |
File di risorse - assembly a cui si fa riferimento |
Uri uri = new Uri("/ReferencedAssembly;component/ResourceFile.xaml", UriKind.Relative); |
File di risorse in una sottocartella - assembly a cui si fa riferimento |
Uri uri = new Uri("/ReferencedAssembly;component/Subfolder/ResourceFile.xaml", UriKind.Relative); |
File di dati |
Uri uri = new Uri("/ContentFile.xaml", UriKind.Relative); |
File di dati in una sottocartella |
Uri uri = new Uri("/Subfolder/ContentFile.xaml", UriKind.Relative); |
Scenari comuni di URI di tipo pack
Nelle sezioni precedenti è stato illustrato come costruire URIs di tipo pack per identificare i file di risorse, di dati e del sito di origine. In WPF queste costruzioni vengono utilizzate in diversi modi. Nelle sezioni che seguono vengono trattati diversi scenari di utilizzo comuni.
Specifica dell'interfaccia utente da visualizzare all'avvio di un'applicazione
StartupUri specifica la prima UI da visualizzare all'avvio di un'applicazione WPF. Nel caso delle applicazioni autonome, l'UI può essere una finestra, come illustrato nell'esempio che segue.
<Application
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
StartupUri="MainWindow.xaml" />
Le applicazioni autonome e le XAML browser applications (XBAPs) possono specificare anche una pagina come interfaccia utente iniziale, come illustrato nell'esempio che segue.
<Application
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
StartupUri="HomePage.xaml" />
Se l'applicazione in questione è un'applicazione autonoma e una pagina viene specificata con StartupUri, WPF apre un oggetto NavigationWindow per ospitare la pagina. Nel caso delle applicazioni XBAPs, la pagina viene visualizzata nel browser host.
Spostamento su una pagina
Nell'esempio seguente viene illustrato come spostarsi su una pagina.
<Page
xmlns="https://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>
Per ulteriori informazioni sulle diverse modalità di spostamento in WPF, vedere Cenni preliminari sulla navigazione.
Specifica dell'icona di una finestra
Nell'esempio riportato di seguito viene illustrato come utilizzare un URI per specificare l'icona di una finestra.
<Window
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.MainWindow"
Icon="WPFIcon1.ico">
</Window>
Per ulteriori informazioni, vedere Icon.
Caricamento di file di immagini, audio e video
WPF consente alle applicazioni di utilizzare un'ampia varietà di tipi di contenuti multimediali, tutti identificabili e caricabili mediante URIs di tipo pack, come illustrato negli esempi che seguono.
<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" />
Per ulteriori informazioni sull'utilizzo di contenuti multimediali, vedere Grafica e funzionalità multimediali.
Caricamento di un dizionario risorse dal sito di origine
I dizionari risorse (ResourceDictionary) possono essere utilizzati per supportare i temi dell'applicazione. Per creare e gestire i temi, è possibile creare più temi sotto forma di dizionari risorse situati nel sito di origine di un'applicazione. In questo modo sarà possibile aggiungere e aggiornare i temi senza dover ricompilare e ridistribuire l'applicazione. Questi dizionari risorse possono essere identificati e caricati mediante URIs di tipo pack, come illustrato nell'esempio che segue.
<Application
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
StartupUri="HomePage.xaml">
<Application.Resources>
<ResourceDictionary Source="pack://siteoforigin:,,,/PageTheme.xaml" />
</Application.Resources>
</Application>
Per informazioni preliminari sui temi in WPF, vedere Applicazione di stili e modelli.