Pakuj URI w WPF

W programie Windows Presentation Foundation (WPF) identyfikatory zasobów jednolitych są używane do identyfikowania i ładowania plików na wiele sposobów, w tym następujących:

  • Określanie interfejsu użytkownika (UI), który ma być wyświetlany po pierwszym uruchomieniu aplikacji.

  • Ładowanie obrazów.

  • Przechodzenie do stron.

  • Ładowanie plików danych innych niż wykonywalne.

Ponadto identyfikatory URI mogą służyć do identyfikowania i ładowania plików z różnych lokalizacji, w tym następujących:

  • Bieżący zestaw.

  • Zestaw, do których odwołuje się odwołanie.

  • Lokalizacja względem zestawu.

  • Witryna źródła aplikacji.

Aby zapewnić spójny mechanizm identyfikacji i ładowania tych typów plików z tych lokalizacji, WPF wykorzystuje rozszerzalność schematu identyfikatora URI pakietu. W tym temacie omówiono schemat, omówiono sposób konstruowania identyfikatorów URI pakietów dla różnych scenariuszy, omawia bezwzględne i względne identyfikatory URI oraz rozpoznawanie identyfikatorów URI przed pokazaniem, jak używać identyfikatorów URI pakietów zarówno z znaczników, jak i kodu.

Schemat identyfikatora URI pakietu

Schemat identyfikatora URI pakietu jest używany przez specyfikację Open Packaging Conventions (OPC), która opisuje model organizowania i identyfikowania zawartości. Kluczowymi elementami tego modelu są pakiety i części, w których pakiet jest kontenerem logicznym dla co najmniej jednej części logicznej. Na poniższej ilustracji przedstawiono tę koncepcję.

Package and Parts diagram

Aby zidentyfikować części, specyfikacja OPC wykorzystuje rozszerzalność RFC 2396 (Uniform Resource Identifiers (URI): Składnia ogólna) do definiowania schematu identyfikatorów URI pakietu.

Schemat określony przez identyfikator URI jest definiowany przez jego prefiks; Http, ftp i file są dobrze znanymi przykładami. Schemat identyfikatora URI pakietu używa jako schematu "pack" i zawiera dwa składniki: urząd i ścieżka. Poniżej przedstawiono format identyfikatora URI pakietu.

ścieżka pack:// authority/

Urząd określa typ pakietu, przez który znajduje się część, podczas gdy ścieżka określa lokalizację części w pakiecie.

To pojęcie zostało zilustrowane na poniższym rysunku:

Relationship among package, authority, and path

Pakiety i części są podobne do aplikacji i plików, w których aplikacja (pakiet) może zawierać co najmniej jeden plik (części), w tym:

  • Pliki zasobów skompilowane w zestawie lokalnym.

  • Pliki zasobów skompilowane w zestawie, do którego się odwołujesz.

  • Pliki zasobów skompilowane do zestawu odwołującego się.

  • Pliki zawartości.

  • Witryna plików źródłowych.

Aby uzyskać dostęp do tych typów plików, platforma WPF obsługuje dwa urzędy: application:/// i siteoforigin:///. Urząd application:/// identyfikuje pliki danych aplikacji, które są znane w czasie kompilacji, w tym pliki zasobów i zawartości. Urząd siteoforigin:/// identyfikuje lokację plików pochodzenia. Zakres każdego urzędu jest pokazany na poniższym rysunku.

Pack URI diagram

Uwaga

Składnik urzędu identyfikatora URI pakietu jest osadzonym identyfikatorem URI wskazującym pakiet i musi być zgodny z specyfikacją RFC 2396. Ponadto znak "/" musi zostać zastąpiony znakiem "," i znakiem zarezerwowanym, takim jak "%" i "?", musi zostać zmieniony. Aby uzyskać szczegółowe informacje, zobacz OPC.

W poniższych sekcjach opisano sposób konstruowania identyfikatorów URI pakietów przy użyciu tych dwóch urzędów w połączeniu z odpowiednimi ścieżkami do identyfikowania zasobów, zawartości i lokacji plików pochodzenia.

Identyfikatory URI pakietu plików zasobów

Pliki zasobów są konfigurowane jako elementy MSBuild Resource i są kompilowane w zestawach. WPF obsługuje konstrukcję identyfikatorów URI pakietów, które mogą służyć do identyfikowania plików zasobów, które są kompilowane w zestawie lokalnym lub kompilowane w zestawie lokalnym, do którego odwołuje się zestaw lokalny.

Plik zasobu zestawu lokalnego

Identyfikator URI pakietu dla pliku zasobu skompilowanego w zestawie lokalnym używa następującego urzędu i ścieżki:

  • Urząd: application:///.

  • Ścieżka: nazwa pliku zasobu, w tym jego ścieżka, względem katalogu głównego folderu projektu zestawu lokalnego.

Poniższy przykład przedstawia identyfikator URI pakietu dla pliku zasobu XAML, który znajduje się w katalogu głównym folderu projektu zestawu lokalnego.

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

W poniższym przykładzie przedstawiono identyfikator URI pakietu dla pliku zasobu XAML, który znajduje się w podfolderze folderu projektu zestawu lokalnego.

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

Plik zasobu zestawu, do których odwołuje się odwołanie

Identyfikator URI pakietu dla pliku zasobu skompilowanego w zestawie, do którego się odwołuje, używa następującego urzędu i ścieżki:

  • Urząd: application:///.

  • Ścieżka: nazwa pliku zasobu skompilowanego w zestawie, do którego się odwołujesz. Ścieżka musi być zgodna z następującym formatem:

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

    • AssemblyShortName: krótka nazwa przywoływanego zestawu.

    • ; Wersja [opcjonalnie]: wersja przywołytowanego zestawu, który zawiera plik zasobu. Jest to używane, gdy ładowane są co najmniej dwa zestawy, do których odwołuje się ta sama krótka nazwa.

    • ;P ublicKey [opcjonalnie]: klucz publiczny użyty do podpisania przywoływał zestawu. Jest to używane, gdy ładowane są co najmniej dwa zestawy, do których odwołuje się ta sama krótka nazwa.

    • ; component: określa, że zestaw, do którego odwołuje się zestaw, jest przywoływany z zestawu lokalnego.

    • /Path: nazwa pliku zasobu, w tym jego ścieżka, względem katalogu głównego folderu projektu przywołytowanego zestawu.

Poniższy przykład przedstawia identyfikator URI pakietu dla pliku zasobu XAML znajdującego się w katalogu głównym folderu projektu przywoływanego zestawu.

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

W poniższym przykładzie przedstawiono identyfikator URI pakietu dla pliku zasobu XAML, który znajduje się w podfolderze folderu projektu przywoływanego zestawu.

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

W poniższym przykładzie przedstawiono identyfikator URI pakietu dla pliku zasobu XAML, który znajduje się w folderze głównym folderu projektu określonego dla określonej wersji zestawu.

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

Należy pamiętać, że składnia identyfikatora URI pakietu dla odwołanych plików zasobów zestawu może być używana tylko z urzędem application:///. Na przykład następujące informacje nie są obsługiwane w WPF.

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

Identyfikatory URI pakietu plików zawartości

Identyfikator URI pakietu dla pliku zawartości używa następującego urzędu i ścieżki:

  • Urząd: application:///.

  • Ścieżka: nazwa pliku zawartości, w tym jego ścieżka względem lokalizacji systemu plików głównego zestawu wykonywalnego aplikacji.

W poniższym przykładzie przedstawiono identyfikator URI pakietu dla pliku zawartości XAML znajdującego się w tym samym folderze co zestaw wykonywalny.

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

W poniższym przykładzie przedstawiono identyfikator URI pakietu dla pliku zawartości XAML znajdującego się w podfolderze, który jest powiązany z zestawem wykonywalnym aplikacji.

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

Uwaga

Nie można przechodzić do plików zawartości HTML. Schemat identyfikatora URI obsługuje tylko nawigację do plików HTML znajdujących się w lokacji źródła.

Identyfikatory URI pakietu pochodzenia

Identyfikator URI pakietu dla pliku pochodzenia używa następującego urzędu i ścieżki:

  • Urząd: siteoforigin:///.

  • Ścieżka: nazwa witryny pliku pochodzenia, w tym jego ścieżka względem lokalizacji, z której został uruchomiony zestaw wykonywalny.

W poniższym przykładzie pokazano identyfikator URI pakietu dla witryny XAML pliku pochodzenia przechowywanego w lokalizacji, z której jest uruchamiany zestaw wykonywalny.

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

W poniższym przykładzie pokazano identyfikator URI pakietu dla witryny XAML pliku pochodzenia przechowywanego w podfolderze, który jest powiązany z lokalizacją, z której jest uruchamiany zestaw wykonywalny aplikacji.

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

Pliki stron

Pliki XAML skonfigurowane jako elementy MSBuild Page są kompilowane w zestawy w taki sam sposób jak pliki zasobów. W związku z tym elementy programu MSBuild Page można zidentyfikować przy użyciu identyfikatorów URI pakietów dla plików zasobów.

Typy plików XAML, które są często skonfigurowane jako elementy MSBuildPage , mają jeden z następujących elementów jako element główny:

Bezwzględne a względne identyfikatory URI pakietów

W pełni kwalifikowany identyfikator URI pakietu zawiera schemat, urząd i ścieżkę oraz jest uważany za bezwzględny identyfikator URI pakietu. W ramach uproszczenia dla deweloperów elementy XAML zwykle umożliwiają ustawianie odpowiednich atrybutów za pomocą względnego identyfikatora URI pakietu, który zawiera tylko ścieżkę.

Rozważmy na przykład następujący bezwzględny identyfikator URI pakietu dla pliku zasobu w zestawie lokalnym.

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

Względny identyfikator URI pakietu, który odwołuje się do tego pliku zasobów, będzie następujący.

/ResourceFile.xaml

Uwaga

Ze względu na to, że lokacja plików pochodzenia nie jest skojarzona z zestawami, można odwoływać się do nich tylko za pomocą bezwzględnych identyfikatorów URI pakietów.

Domyślnie względny identyfikator URI pakietu jest uznawany za względny względem lokalizacji znaczników lub kodu zawierającego odwołanie. Jeśli jednak jest używany wiodący ukośnik odwrotny, względne odwołanie URI pakietu jest uznawane za względne względem katalogu głównego aplikacji. Rozważmy na przykład następującą strukturę projektu.

App.xaml

Page2.xaml

\SubFolder

+ Page1.xaml

+ Page2.xaml

Jeśli page1.xaml zawiera identyfikator URI, który odwołuje się do głównego\podfolderu\Page2.xaml, odwołanie może użyć następującego względnego identyfikatora URI pakietu.

Page2.xaml

Jeśli plik Page1.xaml zawiera identyfikator URI, który odwołuje się do pliku Root\Page2.xaml, odwołanie może użyć następującego względnego identyfikatora URI pakietu.

/Page2.xaml

Rozpoznawanie identyfikatora URI pakietu

Format identyfikatorów URI pakietów umożliwia pakowanie identyfikatorów URI dla różnych typów plików w taki sam sposób. Rozważmy na przykład następujący bezwzględny identyfikator URI pakietu.

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

Ten bezwzględny identyfikator URI pakietu może odwoływać się do pliku zasobu w zestawie lokalnym lub pliku zawartości. To samo dotyczy następującego względnego identyfikatora URI.

/ResourceOrContentFile.xaml

Aby określić typ pliku, do którego odwołuje się identyfikator URI pakietu, WPF rozpoznaje identyfikatory URI dla plików zasobów w lokalnych zestawach i plikach zawartości przy użyciu następujących heurystyki:

  1. Sonduj metadane zestawu dla AssemblyAssociatedContentFileAttribute atrybutu zgodnego z identyfikatorem URI pakietu.

  2. AssemblyAssociatedContentFileAttribute Jeśli atrybut zostanie znaleziony, ścieżka identyfikatora URI pakietu odwołuje się do pliku zawartości.

  3. AssemblyAssociatedContentFileAttribute Jeśli atrybut nie zostanie znaleziony, sonduj zestaw plików zasobów, które są kompilowane w zestawie lokalnym.

  4. Jeśli zostanie znaleziony plik zasobu zgodny ze ścieżką identyfikatora URI pakietu, ścieżka identyfikatora URI pakietu odwołuje się do pliku zasobu.

  5. Jeśli zasób nie zostanie znaleziony, utworzony Uri wewnętrznie jest nieprawidłowy.

Rozpoznawanie identyfikatora URI nie dotyczy identyfikatorów URI odwołujących się do następujących:

  • Pliki zawartości w zestawach, do których odwołuje się odwołanie: te typy plików nie są obsługiwane przez WPF.

  • Pliki osadzone w zestawach, do których odwołuje się odwołanie: identyfikatory URI identyfikujące je są unikatowe, ponieważ zawierają zarówno nazwę przywołytowanego zestawu, jak i sufiks.;component

  • Lokacja plików pochodzenia: identyfikatory URI identyfikujące je są unikatowe, ponieważ są jedynymi plikami, które mogą być identyfikowane przez identyfikatory URI pakietów zawierające urząd siteoforigin:///.

Jednym z uproszczenia, które pozwala na rozpoznawanie identyfikatora URI pakietu, jest to, że kod może być nieco niezależny od lokalizacji plików zasobów i zawartości. Jeśli na przykład masz plik zasobu w zestawie lokalnym, który jest ponownie skonfigurowany jako plik zawartości, identyfikator URI pakietu dla zasobu pozostaje taki sam, jak kod, który używa identyfikatora URI pakietu.

Programowanie przy użyciu identyfikatorów URI pakietów

Wiele klas WPF implementuje właściwości, które można ustawić za pomocą identyfikatorów URI pakietów, w tym:

Te właściwości można ustawić zarówno na podstawie znaczników, jak i kodu. W tej sekcji przedstawiono podstawowe konstrukcje obu tych rozwiązań, a następnie przedstawiono przykłady typowych scenariuszy.

Używanie identyfikatorów URI pakietów w adiustacji

Identyfikator URI pakietu jest określony w adiustacji, ustawiając element atrybutu za pomocą identyfikatora URI pakietu. Przykład:

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

Tabela 1 ilustruje różne bezwzględne identyfikatory URI pakietów, które można określić w znacznikach.

Tabela 1. Bezwzględne identyfikatory URI pakietów w znaczników

Plik Identyfikator URI pakietu bezwzględnego
Plik zasobu — zestaw lokalny "pack://application:,,,/ResourceFile.xaml"
Plik zasobu w podfolderze — zestaw lokalny "pack://application:,,,/Subfolder/ResourceFile.xaml"
Plik zasobu — zestaw, do których się odwołujesz "pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml"
Plik zasobu w podfolderze przywoływnego zestawu "pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml"
Plik zasobu w zestawie, do których odwołuje się wersja "pack://application:,,,/ReferencedAssembly;v1.0.0.0;component/ResourceFile.xaml"
Plik zawartości "pack://application:,,,/ContentFile.xaml"
Plik zawartości w podfolderze "pack://application:,,,/Subfolder/ContentFile.xaml"
Witryna pliku pochodzenia "pack://siteoforigin:,,,/SOOFile.xaml"
Witryna pliku pochodzenia w podfolderze "pack://siteoforigin:,,,/Subfolder/SOOFile.xaml"

Tabela 2 ilustruje różne względne identyfikatory URI pakietów, które można określić w znacznikach.

Tabela 2. Względne identyfikatory URI pakietów w adiustacji

Plik Względny identyfikator URI pakietu
Plik zasobu w zestawie lokalnym "/ResourceFile.xaml"
Plik zasobu w podfolderze zestawu lokalnego "/Subfolder/ResourceFile.xaml"
Plik zasobu w zestawie, do których odwołuje się odwołanie "/ReferencedAssembly;component/ResourceFile.xaml"
Plik zasobu w podfolderze przywoływnego zestawu "/ReferencedAssembly;component/Subfolder/ResourceFile.xaml"
Plik zawartości "/ContentFile.xaml"
Plik zawartości w podfolderze "/Subfolder/ContentFile.xaml"

Używanie identyfikatorów URI pakietów w kodzie

Identyfikator URI pakietu można określić w kodzie, tworząc wystąpienie Uri klasy i przekazując identyfikator URI pakietu jako parametr do konstruktora. Jest to zaprezentowane w poniższym przykładzie.

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

Domyślnie Uri klasa uwzględnia identyfikatory URI pakietów jako bezwzględne. W związku z tym jest zgłaszany wyjątek podczas tworzenia wystąpienia Uri klasy przy użyciu względnego identyfikatora URI pakietu.

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

Na szczęście przeciążenie Uri konstruktora klasy akceptuje parametr typuUriKind, aby umożliwić określenie, Uri(String, UriKind) czy identyfikator URI pakietu jest bezwzględny lub względny.

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

Należy określić tylko Absolute lub Relative wtedy, gdy masz pewność, że podany identyfikator URI pakietu jest jednym lub drugim. Jeśli nie znasz typu identyfikatora URI pakietu, który jest używany, na przykład gdy użytkownik wprowadzi identyfikator URI pakietu w czasie wykonywania, użyj RelativeOrAbsolute zamiast tego.

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

Tabela 3 ilustruje różne względne identyfikatory URI pakietów, które można określić w kodzie przy użyciu polecenia System.Uri.

Tabela 3. Bezwzględne identyfikatory URI pakietów w kodzie

Plik Identyfikator URI pakietu bezwzględnego
Plik zasobu — zestaw lokalny Uri uri = new Uri("pack://application:,,,/ResourceFile.xaml", UriKind.Absolute);
Plik zasobu w podfolderze — zestaw lokalny Uri uri = new Uri("pack://application:,,,/Subfolder/ResourceFile.xaml", UriKind.Absolute);
Plik zasobu — zestaw, do których się odwołujesz Uri uri = new Uri("pack://application:,,,/ReferencedAssembly;component/ResourceFile.xaml", UriKind.Absolute);
Plik zasobu w podfolderze przywoływnego zestawu Uri uri = new Uri("pack://application:,,,/ReferencedAssembly;component/Subfolder/ResourceFile.xaml", UriKind.Absolute);
Plik zasobu w zestawie, do których odwołuje się wersja Uri uri = new Uri("pack://application:,,,/ReferencedAssembly;v1.0.0.0;component/ResourceFile.xaml", UriKind.Absolute);
Plik zawartości Uri uri = new Uri("pack://application:,,,/ContentFile.xaml", UriKind.Absolute);
Plik zawartości w podfolderze Uri uri = new Uri("pack://application:,,,/Subfolder/ContentFile.xaml", UriKind.Absolute);
Witryna pliku pochodzenia Uri uri = new Uri("pack://siteoforigin:,,,/SOOFile.xaml", UriKind.Absolute);
Witryna pliku pochodzenia w podfolderze Uri uri = new Uri("pack://siteoforigin:,,,/Subfolder/SOOFile.xaml", UriKind.Absolute);

Tabela 4 ilustruje różne względne identyfikatory URI pakietów, które można określić w kodzie przy użyciu polecenia System.Uri.

Tabela 4. Względne identyfikatory URI pakietów w kodzie

Plik Względny identyfikator URI pakietu
Plik zasobu — zestaw lokalny Uri uri = new Uri("/ResourceFile.xaml", UriKind.Relative);
Plik zasobu w podfolderze — zestaw lokalny Uri uri = new Uri("/Subfolder/ResourceFile.xaml", UriKind.Relative);
Plik zasobu — zestaw, do których się odwołujesz Uri uri = new Uri("/ReferencedAssembly;component/ResourceFile.xaml", UriKind.Relative);
Plik zasobu w podfolderze — zestaw, do których odwołuje się zestaw Uri uri = new Uri("/ReferencedAssembly;component/Subfolder/ResourceFile.xaml", UriKind.Relative);
Plik zawartości Uri uri = new Uri("/ContentFile.xaml", UriKind.Relative);
Plik zawartości w podfolderze Uri uri = new Uri("/Subfolder/ContentFile.xaml", UriKind.Relative);

Scenariusze identyfikatora URI pakietu Common Pack

W poprzednich sekcjach omówiono sposób konstruowania identyfikatorów URI pakietów w celu identyfikowania zasobów, zawartości i lokacji plików pochodzenia. W WPF te konstrukcje są używane na różne sposoby, a w poniższych sekcjach opisano kilka typowych użycia.

Określanie interfejsu użytkownika do pokazania po uruchomieniu aplikacji

StartupUri określa pierwszy interfejs użytkownika, który ma być wyświetlany po uruchomieniu aplikacji WPF. W przypadku aplikacji autonomicznych interfejs użytkownika może być oknem, jak pokazano w poniższym przykładzie.

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

Aplikacje autonomiczne i aplikacje przeglądarki XAML (XBAPs) mogą również określać stronę jako początkowy interfejs użytkownika, jak pokazano w poniższym przykładzie.

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

Jeśli aplikacja jest aplikacją autonomiczną, a strona jest określona za pomocą StartupUri, WPF otwiera NavigationWindow obiekt do hostowania strony. W przypadku protokołu XBAPs strona jest wyświetlana w przeglądarce hosta.

W poniższym przykładzie pokazano, jak przejść do strony.

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

Aby uzyskać więcej informacji na temat różnych sposobów nawigowania w WPF, zobacz Omówienie nawigacji.

Określanie ikony okna

W poniższym przykładzie pokazano, jak za pomocą identyfikatora URI określić ikonę 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>

W celu uzyskania więcej informacji, zobacz następujący temat: Icon.

Ładowanie obrazów, audio i plików wideo

WPF umożliwia aplikacjom korzystanie z wielu różnych typów multimediów, z których wszystkie mogą być identyfikowane i ładowane z identyfikatorami URI pakietów, jak pokazano w poniższych przykładach.

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

Aby uzyskać więcej informacji na temat pracy z zawartością multimedialną, zobacz Grafika i multimedia.

Ładowanie słownika zasobów z witryny źródła

Słowniki zasobów (ResourceDictionary) mogą służyć do obsługi motywów aplikacji. Jednym ze sposobów tworzenia motywów i zarządzania nimi jest utworzenie wielu motywów jako słowników zasobów znajdujących się w lokacji pochodzenia aplikacji. Dzięki temu motywy można dodawać i aktualizować bez ponownego komplikowania i ponownego wdrażania aplikacji. Te słowniki zasobów można zidentyfikować i załadować przy użyciu identyfikatorów URI pakietów, które przedstawiono w poniższym przykładzie.

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

Aby zapoznać się z omówieniem motywów w WPF, zobacz Styling and Templating (Styleing and Templating).

Zobacz też