Sbalení URI v technologii WPF

Ve Windows Presentation Foundation (WPF) se k identifikaci a načítání souborů používají jednotné identifikátory prostředků (URI) mnoha způsoby, včetně následujících:

  • Zadání uživatelského rozhraní, které se má zobrazit při prvním spuštění aplikace.

  • Načítání obrázků

  • Přechod na stránky

  • Načítání nespustitelných datových souborů

Identifikátory URI se navíc dají použít k identifikaci a načítání souborů z různých umístění, včetně následujících:

  • Aktuální sestavení.

  • Odkazované sestavení.

  • Umístění vzhledem k sestavení.

  • Web původu aplikace.

K zajištění konzistentního mechanismu pro identifikaci a načítání těchto typů souborů z těchto umístění využívá WPF rozšiřitelnost schématu identifikátorů URI balíčku. Toto téma obsahuje přehled schématu, který popisuje, jak sestavit identifikátory URI balíčků pro různé scénáře, popisuje absolutní a relativní identifikátory URI a rozlišení identifikátorů URI před zobrazením použití identifikátorů URI balíčků z revizí i kódu.

Schéma identifikátoru URI balíčku

Schéma identifikátoru URI balíčku se používá ve specifikaci OPC (Open Packaging Conventions ), která popisuje model pro uspořádání a identifikaci obsahu. Klíčové prvky tohoto modelu jsou balíčky a části, kde je balíček logický kontejner pro jednu nebo více logických částí. Tento koncept znázorňuje následující obrázek.

Package and Parts diagram

K identifikaci částí využívá specifikace OPC rozšiřitelnost RFC 2396 (Identifikátory URI): Obecná syntaxe) k definování schématu identifikátorů URI balíčku.

Schéma určené identifikátorem URI je definováno jeho předponou; http, ftp a soubor jsou dobře známé příklady. Schéma identifikátoru URI balíčku používá jako schéma "pack" a obsahuje dvě komponenty: autoritu a cestu. Následuje formát identifikátoru URI balíčku.

cesta k pack:// authority/

Autorita určuje typ balíčku, který je součástí, zatímco cesta určuje umístění části v balíčku.

Tento koncept znázorňuje následující obrázek:

Relationship among package, authority, and path

Balíčky a části jsou podobné aplikacím a souborům, kde aplikace (balíček) může obsahovat jeden nebo více souborů (částí), včetně:

  • Soubory prostředků kompilované do místního sestavení.

  • Soubory prostředků kompilované do odkazovaného sestavení.

  • Soubory prostředků kompilované do odkazujícího sestavení.

  • Soubory obsahu.

  • Web souborů původu

Pro přístup k těmto typům souborů podporuje WPF dva autority: application:/// a siteoforigin:///. Autorita application:/// identifikuje datové soubory aplikace, které jsou známé v době kompilace, včetně souborů prostředků a obsahu. Autorita siteoforigin:/// identifikuje web souborů původu. Rozsah každé autority je znázorněn na následujícím obrázku.

Pack URI diagram

Poznámka:

Součást autority identifikátoru URI balíčku je vložený identifikátor URI, který odkazuje na balíček a musí odpovídat dokumentu RFC 2396. Kromě toho musí být znak "/" nahrazen znakem "," a vyhrazené znaky, jako je například "%" a "?" musí být uchycené. Podrobnosti najdete v OPC.

Následující části vysvětlují, jak pomocí těchto dvou citací vytvořit identifikátory URI balíčků ve spojení s příslušnými cestami pro identifikaci prostředků, obsahu a webu zdrojových souborů.

Identifikátory URI balíčku souborů prostředků

Soubory prostředků jsou nakonfigurovány jako položky NÁSTROJE MSBuild Resource a jsou zkompilovány do sestavení. WPF podporuje vytváření identifikátorů URI balíčků, které lze použít k identifikaci souborů prostředků, které jsou buď zkompilovány do místního sestavení, nebo kompilovány do sestavení, na které se odkazuje z místního sestavení.

Soubor prostředků místního sestavení

Identifikátor URI balíčku pro soubor prostředků zkompilovaný do místního sestavení používá následující autoritu a cestu:

  • Autorita: application:///.

  • Cesta: Název souboru prostředků, včetně jeho cesty, vzhledem k kořenové složce projektu místního sestavení.

Následující příklad ukazuje identifikátor URI balíčku pro soubor prostředků XAML, který je umístěn v kořenovém adresáři složky projektu místního sestavení.

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

Následující příklad ukazuje identifikátor URI balíčku pro soubor prostředků XAML umístěný v podsložce složky projektu místního sestavení.

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

Odkazovaný soubor prostředků sestavení

Identifikátor URI balíčku pro soubor prostředků kompilovaný do odkazovaného sestavení používá následující autoritu a cestu:

  • Autorita: application:///.

  • Cesta: Název souboru prostředku, který je zkompilován do odkazovaného sestavení. Cesta musí odpovídat následujícímu formátu:

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

    • AssemblyShortName: krátký název odkazovaného sestavení.

    • ; Verze [volitelné]: Verze odkazovaného sestavení, která obsahuje soubor prostředků. Používá se při načtení dvou nebo více odkazovaných sestavení se stejným krátkým názvem.

    • ;P ublicKey [volitelné]: veřejný klíč použitý k podepsání odkazovaného sestavení. Používá se při načtení dvou nebo více odkazovaných sestavení se stejným krátkým názvem.

    • ; součást: Určuje, že sestavení, na které odkazuje, je odkazováno z místního sestavení.

    • /Path: název souboru zdroje, včetně jeho cesty vzhledem ke kořenové složce projektu odkazovaného sestavení.

Následující příklad ukazuje identifikátor URI balíčku pro soubor prostředků XAML umístěný v kořenovém adresáři složky projektu odkazovaného sestavení.

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

Následující příklad ukazuje identifikátor URI balíčku pro soubor prostředků XAML umístěný v podsložce složky projektu odkazovaného sestavení.

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

Následující příklad ukazuje identifikátor URI balíčku pro soubor prostředku XAML, který je umístěn v kořenové složce odkazované složky projektu sestavení specifické pro verzi.

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

Všimněte si, že syntaxe identifikátoru URI balíčku pro odkazované soubory prostředků sestavení lze použít pouze s autoritou application:///. Například následující není podporováno ve WPF.

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

Identifikátory URI balíčku souborů obsahu

Identifikátor URI balíčku pro soubor obsahu používá následující autoritu a cestu:

  • Autorita: application:///.

  • Cesta: Název souboru obsahu, včetně jeho cesty vzhledem k umístění systému souborů hlavního spustitelného sestavení aplikace.

Následující příklad ukazuje identifikátor URI balíčku pro soubor obsahu XAML umístěný ve stejné složce jako spustitelné sestavení.

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

Následující příklad ukazuje identifikátor URI balíčku pro soubor obsahu XAML umístěný v podsložce, která je relativní vzhledem ke spustitelnému sestavení aplikace.

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

Poznámka:

Soubory obsahu HTML nelze přejít na. Schéma identifikátoru URI podporuje navigaci pouze k souborům HTML umístěným v lokalitě původu.

Identifikátory URI balíčku původu

Identifikátor URI balíčku pro lokalitu zdrojového souboru používá následující autoritu a cestu:

  • Autorita: siteoforigin:///.

  • Cesta: Název lokality zdrojového souboru, včetně jeho cesty vzhledem k umístění, ze kterého bylo spuštěno spustitelné sestavení.

Následující příklad ukazuje identifikátor URI balíčku pro web XAML zdrojového souboru, který je uložen v umístění, ze kterého je spuštěn spustitelné sestavení.

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

Následující příklad ukazuje identifikátor URI balíčku pro lokalitu XAML zdrojového souboru, který je uložen v podsložce vzhledem k umístění, ze kterého je spuštěn spustitelné sestavení aplikace.

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

Stránkové soubory

Soubory XAML nakonfigurované jako položky NÁSTROJE MSBuild Page se kompilují do sestavení stejným způsobem jako soubory prostředků. V důsledku toho lze identifikovat položky NÁSTROJE MSBuild Page pomocí identifikátorů URI balíčků pro soubory prostředků.

Typy souborů XAML, které jsou běžně nakonfigurované jako položky MSBuildPage , mají jeden z následujících prvků jako kořenový prvek:

Absolutní versus relativní identifikátory URI balíčku

Plně kvalifikovaný identifikátor URI balíčku obsahuje schéma, autoritu a cestu a považuje se za absolutní identifikátor URI balíčku. Jako zjednodušení pro vývojáře prvky XAML obvykle umožňují nastavit příslušné atributy s relativním identifikátorem URI balíčku, který zahrnuje pouze cestu.

Představte si například následující absolutní identifikátor URI balíčku pro soubor prostředků v místním sestavení.

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

Identifikátor URI relativního balíčku, který odkazuje na tento soubor prostředků, by byl následující.

/ResourceFile.xaml

Poznámka:

Vzhledem k tomu, že soubory původu webu nejsou přidruženy k sestavením, lze je odkazovat pouze s absolutními identifikátory URI balíčků.

Ve výchozím nastavení se relativní identifikátor URI balíčku považuje za relativní vzhledem k umístění značky nebo kódu, který obsahuje odkaz. Pokud se však použije počáteční zpětné lomítko, je odkaz na identifikátor URI relativního balíčku považován za relativní vzhledem ke kořenovému adresáři aplikace. Představte si například následující strukturu projektu.

App.xaml

Page2.xaml

\SubFolder

+ Page1.xaml

+ Page2.xaml

Pokud Page1.xaml obsahuje identifikátor URI, který odkazuje na root\SubFolder\Page2.xaml, může odkaz použít následující identifikátor URI relativního balíčku.

Page2.xaml

Pokud Page1.xaml obsahuje identifikátor URI, který odkazuje na root\Page2.xaml, může odkaz použít následující identifikátor URI relativního balíčku.

/Page2.xaml

Rozlišení identifikátoru URI balíčku

Formát identifikátorů URI balíčků umožňuje, aby identifikátory URI balíčků pro různé typy souborů vypadaly stejně. Představte si například následující absolutní identifikátor URI balíčku.

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

Tento absolutní identifikátor URI balíčku může odkazovat buď na soubor prostředků v místním sestavení, nebo na soubor obsahu. Totéž platí pro následující relativní identifikátor URI.

/ResourceOrContentFile.xaml

Aby bylo možné určit typ souboru, na který odkazuje identifikátor URI balíčku, wpF přeloží identifikátory URI pro soubory prostředků v místních sestaveních a souborech obsahu pomocí následujících heuristiky:

  1. Zkontrolujte metadata sestavení pro AssemblyAssociatedContentFileAttribute atribut, který odpovídá identifikátoru URI balíčku.

  2. AssemblyAssociatedContentFileAttribute Pokud se atribut najde, cesta identifikátoru URI balíčku odkazuje na soubor obsahu.

  3. AssemblyAssociatedContentFileAttribute Pokud atribut nebyl nalezen, zkontrolujte soubory prostředků sady, které jsou zkompilovány do místního sestavení.

  4. Pokud se najde soubor prostředků, který odpovídá cestě identifikátoru URI balíčku, cesta identifikátoru URI balíčku odkazuje na soubor prostředků.

  5. Pokud se prostředek nenajde, interně vytvořený Uri prostředek je neplatný.

Rozlišení identifikátoru URI se nevztahuje na identifikátory URI, které odkazují na následující:

  • Soubory obsahu v odkazovaných sestaveních: WPF nepodporuje tyto typy souborů.

  • Vložené soubory v odkazovaných sestaveních: identifikátory URI, které je identifikují, jsou jedinečné, protože obsahují jak název odkazovaného sestavení, tak příponu ;component .

  • Web souborů původu: Identifikátory URI, které je identifikují, jsou jedinečné, protože jde o jediné soubory, které lze identifikovat pomocí identifikátorů URI balíčků, které obsahují autoritu siteoforigin:///.

Jedním ze zjednodušení, které rozlišení identifikátoru URI balíčku umožňuje, je, aby kód byl poněkud nezávislý na umístění prostředků a souborů obsahu. Pokud například máte soubor prostředků v místním sestavení, které je překonfigurováno jako soubor obsahu, identifikátor URI balíčku pro prostředek zůstane stejný jako kód, který používá identifikátor URI balíčku.

Programování s identifikátory URI balíčků

Mnoho tříd WPF implementuje vlastnosti, které lze nastavit pomocí identifikátorů URI balíčků, včetně:

Tyto vlastnosti lze nastavit z revizí i kódu. Tato část ukazuje základní konstrukce pro obě a pak ukazuje příklady běžných scénářů.

Použití identifikátorů URI balíčků v revizích

Identifikátor URI balíčku je zadán v kódu nastavením elementu atributu s identifikátorem URI balíčku. Příklad:

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

Tabulka 1 znázorňuje různé identifikátory URI absolutního balíčku, které můžete zadat v kódu.

Tabulka 1: Absolutní identifikátory URI balíčku v revizích

Soubor Absolutní identifikátor URI balíčku
Soubor prostředků – místní sestavení "pack://application:,,,/ResourceFile.xaml"
Soubor prostředků v podsložce – místní sestavení "pack://application:,,,/Subfolder/ResourceFile.xaml"
Soubor prostředků – odkazované sestavení "pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml"
Soubor prostředků v podsložce odkazovaného sestavení "pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml"
Soubor prostředků ve verzích odkazovaném sestavení "pack://application:,,,/ReferencedAssembly;v1.0.0.0;component/ResourceFile.xaml"
Soubor obsahu "pack://application:,,,/ContentFile.xaml"
Soubor obsahu v podsložce "pack://application:,,,/Subfolder/ContentFile.xaml"
Web zdrojového souboru "pack://siteoforigin:,,,/SOOFile.xaml"
Web zdrojového souboru v podsložce "pack://siteoforigin:,,,/Subfolder/SOOFile.xaml"

Tabulka 2 znázorňuje různé identifikátory URI relativního balíčku, které můžete zadat v kódu.

Tabulka 2: Identifikátory URI relativního balíčku v revizích

Soubor Identifikátor URI relativního balíčku
Soubor prostředků v místním sestavení "/ResourceFile.xaml"
Soubor prostředků v podsložce místního sestavení "/Subfolder/ResourceFile.xaml"
Soubor prostředků v odkazovaném sestavení "/ReferencedAssembly;component/ResourceFile.xaml"
Soubor prostředků v podsložce odkazovaného sestavení "/ReferencedAssembly;component/Subfolder/ResourceFile.xaml"
Soubor obsahu "/ContentFile.xaml"
Soubor obsahu v podsložce "/Subfolder/ContentFile.xaml"

Použití identifikátorů URI balíčků v kódu

Identifikátor URI balíčku zadáte v kódu vytvořením instance Uri třídy a předáním identifikátoru URI balíčku jako parametr konstruktoru. To je patrné z následujícího příkladu.

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

Ve výchozím nastavení Uri třída považuje identifikátory URI balíčků za absolutní. V důsledku toho je vyvolána výjimka při vytvoření instance Uri třídy s relativním identifikátorem URI balíčku.

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

Přetížení konstruktoru Uri třídy naštěstí přijímá parametr typuUriKind, který vám umožní určit, Uri(String, UriKind) zda je identifikátor URI balíčku absolutní nebo relativní.

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

Měli byste zadat pouze Absolute nebo Relative pokud jste si jisti, že zadaný identifikátor URI balíčku je jeden nebo druhý. Pokud neznáte typ identifikátoru URI balíčku, který se používá, například když uživatel za běhu zadá identifikátor URI balíčku, použijte RelativeOrAbsolute místo toho.

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

Tabulka 3 znázorňuje různé identifikátory URI relativního balíčku, které můžete zadat v kódu pomocí System.Uri.

Tabulka 3: Absolutní identifikátory URI balíčku v kódu

Soubor Absolutní identifikátor URI balíčku
Soubor prostředků – místní sestavení Uri uri = new Uri("pack://application:,,,/ResourceFile.xaml", UriKind.Absolute);
Soubor prostředků v podsložce – místní sestavení Uri uri = new Uri("pack://application:,,,/Subfolder/ResourceFile.xaml", UriKind.Absolute);
Soubor prostředků – odkazované sestavení Uri uri = new Uri("pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml", UriKind.Absolute);
Soubor prostředků v podsložce odkazovaného sestavení Uri uri = new Uri("pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml", UriKind.Absolute);
Soubor prostředků ve verzích odkazovaném sestavení Uri uri = new Uri("pack://application:,,,/ReferencedAssembly;v1.0.0.0;component/ResourceFile.xaml", UriKind.Absolute);
Soubor obsahu Uri uri = new Uri("pack://application:,,,/ContentFile.xaml", UriKind.Absolute);
Soubor obsahu v podsložce Uri uri = new Uri("pack://application:,,,/Subfolder/ContentFile.xaml", UriKind.Absolute);
Web zdrojového souboru Uri uri = new Uri("pack://siteoforigin:,,,/SOOFile.xaml", UriKind.Absolute);
Web zdrojového souboru v podsložce Uri uri = new Uri("pack://siteoforigin:,,,/Subfolder/SOOFile.xaml", UriKind.Absolute);

Tabulka 4 znázorňuje různé identifikátory URI relativního balíčku, které můžete zadat v kódu pomocí System.Uri.

Tabulka 4: Identifikátory URI relativního balíčku v kódu

Soubor Identifikátor URI relativního balíčku
Soubor prostředků – místní sestavení Uri uri = new Uri("/ResourceFile.xaml", UriKind.Relative);
Soubor prostředků v podsložce – místní sestavení Uri uri = new Uri("/Subfolder/ResourceFile.xaml", UriKind.Relative);
Soubor prostředků – odkazované sestavení Uri uri = new Uri("/ReferencedAssembly;component/ResourceFile.xaml", UriKind.Relative);
Soubor prostředků v podsložce – odkazované sestavení Uri uri = new Uri("/ReferencedAssembly;component/Subfolder/ResourceFile.xaml", UriKind.Relative);
Soubor obsahu Uri uri = new Uri("/ContentFile.xaml", UriKind.Relative);
Soubor obsahu v podsložce Uri uri = new Uri("/Subfolder/ContentFile.xaml", UriKind.Relative);

Běžné scénáře identifikátoru URI balíčku

V předchozích částech jsme probrali, jak vytvořit identifikátory URI balíčků pro identifikaci prostředků, obsahu a webů zdrojových souborů. Ve WPF se tyto konstrukce používají různými způsoby a následující části pokrývají několik běžných použití.

Zadání uživatelského rozhraní, které se má zobrazit při spuštění aplikace

StartupUri určuje první uživatelské rozhraní, které se má zobrazit při spuštění aplikace WPF. U samostatných aplikací může být uživatelské rozhraní oknem, jak je znázorněno v následujícím příkladu.

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

Samostatné aplikace a aplikace prohlížeče XAML (XBAPs) můžou také zadat stránku jako počáteční uživatelské rozhraní, jak je znázorněno v následujícím příkladu.

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

Pokud je aplikace samostatnou aplikací a je zadána stránka s StartupUri, WPF otevře NavigationWindow pro hostování stránky. U XBAPs se stránka zobrazí v prohlížeči hostitele.

Následující příklad ukazuje, jak přejít na stránku.

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

Další informace o různých způsobech navigace ve WPF naleznete v části Přehled navigace.

Určení ikony okna

Následující příklad ukazuje, jak pomocí identifikátoru URI určit ikonu okna.

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

Další informace najdete na webu Icon.

Načítání obrázků, zvukových souborů a videosouborů

WPF umožňuje aplikacím používat širokou škálu typů médií, z nichž všechny lze identifikovat a načíst pomocí identifikátorů URI balíčků, jak je znázorněno v následujících příkladech.

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

Další informace o práci s multimediálním obsahem naleznete v tématu Grafika a multimédia.

Načtení slovníku prostředků z webu původu

Slovníky prostředků (ResourceDictionary) je možné použít k podpoře motivů aplikací. Jedním ze způsobů, jak vytvářet a spravovat motivy, je vytvořit více motivů jako slovníky prostředků, které se nacházejí na webu původu aplikace. To umožňuje přidávat a aktualizovat motivy bez opětovného zkompilování a opětovného nasazení aplikace. Tyto slovníky prostředků je možné identifikovat a načíst pomocí identifikátorů URI balíčků, které jsou znázorněny v následujícím příkladu.

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

Přehled motivů ve WPF najdete v tématu Styling a Šablonování.

Viz také