Struktura aplikacji Udostępnij na: Facebook

W fazie tworzenia przy użyciu zarządzanego interfejsu API aplikacji opartej na programie Silverlight, w procesie kompilacji tworzony jest pakiet aplikacji. Pakiet aplikacji to plik w formacie zip (skompresowany przy użyciu algorytmu Deflate) o rozszerzeniu xap. Plik ten zazwyczaj zawiera główne zestawy i zasoby aplikacji. Zawiera on też wygenerowany w procesie kompilacji manifest, opisujący aplikację i określający, jakie zestawy są potrzebne do jej uruchomienia. Mogą to być zestawy wewnętrzne (wchodzące w skład pakietu aplikacji) lub zewnętrzne.

Osadzając dodatek plug-in Silverlight na stronie internetowej, należy określić pakiet aplikacji, który dodatek powinien pobrać. Dodatek plug-in używa pliku manifestu w pakiecie aplikacji do zidentyfikowania klasy aplikacji, której wystąpienie ma zostać utworzone. Klasa ta stanowi tzw. punkt wejścia aplikacji. Musi ona być pochodną klasy Application (j.ang.).

Jeśli używane jest buforowanie bibliotek aplikacji, manifest wskazuje też, które wymagane zestawy są zewnętrzne w stosunku do pakietu aplikacji. Dodatek plug-in pobierze wszystkie takie pliki. W przypadku aplikacji zlokalizowanych dodatek plug-in pobierze także odpowiednie do języka zestawy dodatkowe dla wszystkich zewnętrznych i wewnętrznych zestawów wymaganych. Więcej informacji można uzyskać w dokumencie Wdrażanie i lokalizacja (j.ang.).

Klasa Application (j.ang.) udostępnia zdarzenie Startup (j.ang.), którego obsługa umożliwia inicjalizację aplikacji i jej interfejsu użytkownika. Klasa Application (j.ang.) udostępnia też inne usługi związane z aplikacjami, które są często wymagane. Umożliwia ona np. pobranie plików zasobów z pakietu aplikacji lub z pobranych plików zip. Więcej informacji można uzyskać w dokumencie Usługi związane z aplikacjami (j.ang.). Można też dodawać niestandardowe usługi związane z aplikacjami. Więcej informacji można uzyskać w dokumencie Usługi rozszerzeń aplikacji (j.ang.).

Procedura pobierania plików startowych aplikacji i tworzenia wystąpienia klasy aplikacji jest nazywane systemem aktywacji programu Silverlight. W systemie aktywacji można określić minimalną liczbę pakietów, które muszą zostać pobrane. Pozwala to na optymalizację buforowania. Po aktywacji aplikacja może w miarę potrzeb pobierać dodatkowe zestawy bibliotek i pliki zasobów.

W niniejszym dokumencie opisano strukturę pakietu aplikacji. Dokument zawiera też opis opcji wdrożenia plików w obrębie pakietu aplikacji — jako wymaganych składników zewnętrznych lub jako plików na żądanie.

Informacje na temat tworzenia aplikacji można uzyskać w dokumencie Jak to zrobić: tworzenie nowego projektu programu Silverlight. Informacje o hostingu aplikacji na stronie internetowej można uzyskać w dokumencie Integracja programu Silverlight ze stroną internetową.

Pakiet aplikacji

Pakiet aplikacji zawiera następujące pliki:

  • Jeden plik AppManifest.xaml, identyfikujący zestawy w pakiecie oraz punkt wejścia aplikacji.
  • Jeden zestaw aplikacji, uwzględniający klasę aplikacji.
  • Opcjonalnie zestaw lub zestawy bibliotek.
  • Opcjonalnie luźne pliki zasobów, np. graficzne lub wideo.

Plik AppManifest.xaml jest zazwyczaj generowany w procesie kompilacji. Używane jest w nim oznakowanie XAML do zadeklarowania obiektu Deployment (j.ang.) aplikacji.

W pliku AppManifest.xaml element Deployment (j.ang.) zawiera następujące atrybuty:

Element Deployment (j.ang.) zawiera też podrzędny element Deployment..::.Parts, który z kolei zawiera podrzędny element AssemblyPart (j.ang.) dla każdego zestawu w pakiecie aplikacji.

W razie używania buforowania bibliotek aplikacji element Deployment (j.ang.) może też zawierać podrzędny element (właściwość) Deployment..::.ExternalParts (j.ang.). Ten element jest obecny, jeśli zostały dodane odwołania do zestawów bibliotek skonfigurowanych do użytku z buforowaniem bibliotek aplikacji. Element Deployment..::.ExternalParts (j.ang.) zawiera element podrzędny ExtensionPart (j.ang.) dla każdego zewnętrznego pakietu biblioteki.

Pakiet aplikacji musi uwzględniać plik AppManifest.xaml i zestaw punktu wejścia aplikacji. Pozostałe komponenty aplikacji można wdrożyć jako pliki w pakiecie, pliki ExternalPart (j.ang.) lub pliki na żądanie.

Pliki w pakiecie to pliki dołączone do pakietu aplikacji. Zazwyczaj uwzględnia się główne pliki, wymagane przez aplikację do uruchomienia lub potrzebne natychmiast po uruchomieniu w celu uniknięcia opóźnień po uruchomieniu. Można też dołączyć zasoby współużytkowane, np. grafiki, które można osadzać w zestawach lub udostępniać jako osobne pliki w pakiecie aplikacji.

Pliki ExternalPart (j.ang.) to pliki w formacie zip, zawierające co najmniej jeden zestaw wymagany do uruchomienia aplikacji. Zazwyczaj są to zestawy bibliotek, które będą rzadziej modyfikowane od głównych plików aplikacji. Można podnieść wydajność buforowania na komputerach użytkowników, udostępniając te pliki jako osobne pliki do pobrania. Więcej informacji można uzyskać w dokumencie Jak to zrobić: używanie buforowania bibliotek.

Pliki na żądanie to pliki wdrażane na serwerze, zazwyczaj w tej samej lokalizacji, co pakiet aplikacji. Aplikacja może pobrać te pliki po aktywacji. Istnieje kilka opcji pobrania plików na żądanie, stosowanych zależnie od typu i wielkości pliku. Można np. użyć bezpośrednich odwołań do identyfikatorów URI w celu pobrania plików graficznych lub rozpocząć asynchroniczne pobieranie zestawów bibliotek albo plików zip. Więcej informacji można uzyskać w kolejnej sekcji.

Poniższy wykres zawiera podsumowanie struktury pakietu aplikacji i opcji wdrażania plików aplikacji.

Wdrażanie plików w pakiecie, jako składników zewnętrznych lub na żądanie

Zazwyczaj wszystkie pliki aplikacji są wdrażane w pakiecie aplikacji, o ile tylko nie powoduje to zbyt długiego czasu pobierania i uruchamiania. Zależy to od wymagań aplikacji. Można np. dołączyć do pakietu aplikacji jak największą liczbę plików, aby przyspieszyć działanie po uruchomieniu. W takim wypadku można dołączyć ekran powitalny, wyświetlany podczas pobierania. Więcej informacji można uzyskać w dokumencie Ekrany powitalne programu Silverlight (j.ang.).

Można zmniejszyć rozmiar pakietu aplikacji, używając buforowania bibliotek aplikacji. Nie powoduje to jednak zmniejszenia czasu pierwszego pobierania, a niekiedy może doprowadzić do wydłużenia czasu pobierania ze względu na dodatkowe żądania sieciowe. Korzyścią z buforowania bibliotek aplikacji jest to, że po zmianie kodu aplikacji powracający użytkownicy nie muszą pobierać zestawów bibliotek, które nie uległy zmianie.

W wypadku bardzo dużych pakietów aplikacji wczytywanie dodatku plug-in Silverlight może się nie powieść. Tworząc duże aplikacje należy ograniczyć wielkość pakietu aplikacji, używając buforowania bibliotek aplikacji lub pobierania plików na żądanie.

W razie podjęcia decyzji o przeniesieniu części plików poza pakiet aplikacji istnieje kilka dostępnych opcji ponownego wdrożenia.

Najłatwiejsze do ponownego wdrożenia są pliki, w których przypadku użyto względnych odwołań do identyfikatora URI — np. pliki graficzne lub wideo. Kiedy dodatek plug-in Silverlight napotyka w kodzie lub w pliku XAML względny identyfikator URI, najpierw sprawdzany jest pakiet aplikacji. Jeśli plik nie zostanie znaleziony w pakiecie aplikacji, sprawdzany jest serwer-host. Oznacza to, że pliki, w których przypadku użyto względnego odwołania do identyfikatora URI, można przenosić bez potrzeby zmieniania kodu. Więcej informacji można uzyskać w dokumencie Pliki zasobów (j.ang.).

W przypadku wielu plików odwołania przy użyciu identyfikatora URI są niemożliwe. Pliki takie wymagają dodatkowych działań w razie ponownego wdrożenia jako plików na żądanie. Ponowne wdrożenie np. zestawu biblioteki wymaga dodania kodu pobierającego zestaw na żądanie i wczytującego go do domeny aplikacji. Więcej informacji można uzyskać w dokumencie Jak to zrobić: wczytywanie zestawów na żądanie. W takim wypadku wymagane jest również odwołanie do zestawu w projekcie aplikacji, ale wartość właściwości Copy Local należy ustawić na False. Zapobiega to dodaniu zestawu do pakietu aplikacji w trakcie kompilacji lub wymaganiu go do uruchomienia, jak w przypadku zestawu ExternalPart (j.ang.).

Niekiedy warto też przenieść część powiązanych plików zasobów poza pakiet aplikacji, ale pobierać je na żądanie w postaci jednego pliku. W tym celu należy utworzyć z nich pakiet zip, a następnie umieścić go na serwerze. Następnie należy dodać kod pobierający na żądanie plik zip i wyodrębniający zawartość. Więcej informacji można uzyskać w dokumencie Pobieranie zawartości na żądanie (j.ang.).

Jak to zrobić: używanie buforowania bibliotek

[Uwaga: Niniejsza dokumentacja dotyczy wersji wstępnej produktu. Odpowiednie informacje mogą ulec zmianie w przyszłych wersjach. Puste tematy są uwzględnione tymczasowo].

Buforowanie bibliotek aplikacji może usprawnić uruchamianie aplikacji na komputerach użytkowników ponownie odwiedzających witrynę.

Kiedy używane jest buforowanie bibliotek aplikacji, program Silverlight umieszcza niektóre zestawy w pakietach będących składnikami zewnętrznymi w stosunku do pakietu aplikacji (pliku .xap). Manifest w pakiecie aplikacji określa, które zestawy są wymagane do uruchomienia i wskazuje, czy są to zestawy wewnętrzne, czy też zewnętrzne w stosunku do pakietu aplikacji.

Kiedy użytkownik odwiedza stronę internetową po raz pierwszy, dodatek plug-in Silverlight pobiera pakiet aplikacji i wszystkie wymagane składniki zewnętrzne. Pliki te są dodawane do bufora przeglądarki, co pozwala na ich ponowne użycie w kolejnych odwiedzinach.

Ustawienia dotyczące wszystkich pobieranych plików zależą od konfiguracji buforowania na serwerze i w przeglądarce. W typowej konfiguracji pliki są pobierane tylko wtedy, gdy nie znajdują się w buforze lub są nowsze od wersji znajdujących się w buforze.

Zestawy bibliotek są zazwyczaj modyfikowane dużo rzadziej od zestawów aplikacji. Dlatego też sensownym wyjściem jest buforowanie ich jako osobnych plików. Dzięki temu w razie zmiany kodu aplikacji bez zmieniania kodu biblioteki powracający użytkownicy będą pobierać jedynie plik .xap.

W zestawie SDK programu Silverlight dostępnych jest wiele bibliotek, które nie wchodzą w skład środowiska wykonawczego. Te biblioteki są wstępnie skonfigurowanie do użycia z buforowaniem bibliotek aplikacji. W programie Visual Studio te biblioteki znajdują się na karcie .NET okna dialogowego Dodaj odwołanie wraz z zestawami środowiska wykonawczego. Można też uzyskać do nich dostęp w folderze zestawu SDK programu Silverlight. Domyślnie zestaw SDK programu Silverlight jest zainstalowany w folderze %ProgramFiles%\Microsoft SDKs\Silverlight. Można też skonfigurować własne zestawy obsługujące buforowanie bibliotek aplikacji.

Buforowanie bibliotek aplikacji wpływa jedynie na zestawy wymagane do uruchomienia aplikacji. Jeśli aplikacja wczytuje określone zestawy na żądanie, są one zawsze pobierane z serwera, a nie z bufora przeglądarki.

Poniższa procedura opisuje włączanie buforowania bibliotek aplikacji i korzystanie z tej funkcji, a także konfigurowanie własnych zestawów pod kątem buforowania.

Aby włączyć buforowanie bibliotek aplikacji:

1. W Eksploratorze rozwiązań zaznacz projekt aplikacji Silverlight, w którym chcesz włączyć  buforowanie bibliotek.

2. W menu Project wybierz polecenie nazwa projektuProperties.
Spowoduje to otworzenie okna projektanta.

3. Na karcie Silverlight wybierz pozycję Reduce XAP size by using application library caching.

Uwaga:
W aplikacji z obsługą działania poza przeglądarką nie można używać buforowania bibliotek. Aplikacje działające poza przeglądarką wymagają, by wszystkie zestawy wymagane do uruchomienia znajdowały się w pakiecie aplikacji.

4. Dodaj odwołanie do zestawu biblioteki w zestawie SDK programu Silverlight lub do dowolnego zestawu z poprawnym plikiem mapowania assemblyShortName.extmap.xml.

Powoduje to wykonanie następujących działań:

· Odwołanie do zestawu zostaje dodane do projektu z właściwością Copy Local o wartości True. Wartość ta wskazuje, że zestaw jest wymagany do uruchomienia. Jest to ta sama wartość, która jest używana w zestawach w pakiecie.

· Podczas kompilacji projektu zestaw jest umieszczany w osobnym pliku zip. Ponadto generowany jest element ExtensionPart (j.ang.) w manifeście aplikacji.

· Kiedy dodatek plug-in Silverlight wczytuje pakiet aplikacji, w manifeście sprawdzane są elementy ExtensionPart (j.ang.). Następnie pobierane są odpowiednie pliki. Jeśli w aplikacji używany jest ekran powitalny, będzie on otwarty do czasu wczytania wszystkich składników zewnętrznych.

Aby skonfigurować zestaw pod kątem buforowania bibliotek aplikacji:

1. Utwórz plik mapowania w tej samej lokalizacji, co zestaw. Plik musi mieć taką samą nazwę, jak zestaw, ale rozszerzenie dll należy zastąpić rozszerzeniem extmap.xml. Plik zestawu SDK programu Silverlight o nazwie System.Json.dll ma zatem plik mapowania o nazwie System.Json.extmap.xml.

2. Dodaj do pliku mapowania dane konfiguracji zgodnie z poniższym przykładem, modyfikując wartości w elemencie assembly w taki sposób, aby odpowiadały danym Twojego zestawu.

<?xml version="1.0"?>
<manifest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
          xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <assembly>
    <name>System.Json</name>
    <version>2.0.5.0</version>
    <publickeytoken>31bf3856ad364e35</publickeytoken>
    <relpath>System.Json.dll</relpath>
    <extension downloadUri="System.Json.zip" />
  </assembly>
</manifest>

Elementy name, version i publickeytoken muszą być zgodne z odpowiednimi metadanymi zestawu. Element relpath wskazuje nazwę pliku zestawu. Element extension wskazuje nazwę składnika zewnętrznego w postaci pliku zip, używając do tego atrybutu downloadUri.

Wartość atrybutu downloadUri służy do wypełnienia wartości właściwości ExtensionPart..::.Source (j.ang.) w manifeście aplikacji, zgodnie z tym, co widać w poniższym przykładowym fragmencie manifestu.

<Deployment.ExternalParts>
  <ExtensionPart Source="System.Json.zip" />
</Deployment.ExternalParts>

Jeśli wartość właściwości downloadUri jest nazwą pliku, program Visual Studio zapewnia następującą obsługę po dodaniu odwołania do zestawu:

· System kompilacji umieszcza zestaw w pliku zip o określonej nazwie. Plik ten jest kopiowany do katalogu wyjściowego łącznie z plikiem xap.

· Jeśli dodane zostaną odwołania do co najmniej dwóch zestawów, mające taką samą nazwę pliku we właściwości downloadUri, system kompilacji skompresuje wszystkie te zestawy w jednym pliku zip.

· Rozszerzenie zip nie jest dodawane automatycznie. Plik pakietu jest w formacie zip, ale można użyć dowolnego rozszerzenia wymaganego przez serwer.

Jeśli wartość właściwości downloadUri jest bezwzględnym identyfikatorem URI, system kompilacji nie utworzy pliku zip. Użytkownik musi w takim wypadku samodzielnie utworzyć plik zip zestawu i umieścić go w miejscu zgodnym z identyfikatorem URI. Jest to przydatne, jeśli należy utworzyć repozytorium bibliotek, które ma być używane przez wiele aplikacji. Jednak przed podaniem bezwzględnej wartości właściwości downloadUri należy wziąć pod uwagę poniższe kwestie.

· Jeśli identyfikator URI wskazuje domenę inną niż ta, w której znajduje się plik xap, w folderze głównym tej domeny musi znajdować się plik zasad międzydomenowych. Więcej informacji można uzyskać w dokumencie Komunikacja i zabezpieczenia protokołu HTTP w programie Silverlight (j.ang.).

Należy pamiętać, że identyfikator URI jest unikalny globalne i może odnosić się do konkretnego pliku zestawu. Oznacza to, że należy używać różnych identyfikatorów URI w róznych wersjach zestawów. Ponadto należy utrzymywać identyfikatory URI i zestawy dla poszczególnych wersji, tworzone podczas wdrażania nowych wersji zestawów o zaktualizowanych identyfikatorach URI. Pozwala to uniknąć błędów, jakie mogą powstać, kiedy plik xap utwoarzony w jednej wersji programu Silverlight podejmuje próbę wczytania biblioteki utworzonej przy użyciu innej wersji.

Aby przetestować buforowanie bibliotek aplikacji w programie Visual Studio:

1. Pobierz i zainstaluj monitor ruchu HTTP, np. program Fiddler (j.ang.). Umożliwia to wyświetlanie żądań i odpowiedzi HTTP oraz sprawdzanie, czy zbuforowane pliki nie są pobierane.

2. Włącz następujące funkcje systemu Windows:

· Internetowe usługi informacyjne (IIS)

· Zgodność metabazy usług IIS z konfiguracją usług IIS w wersji 6

· ASP.NET

· Uwierzytelnianie systemu Windows

Program IIS jest wymagany, ponieważ program Visual Studio Development Server nie umożliwia buforowania w nagłówkach odpowiedzi HTTP.

3. Uruchom program Visual Studio z uprawnieniami administratora.

4. Dołącz projekt sieci Web do celów testowych do rozwiązania zawierającego projekt programu Silverlight.

5. Skonfiguruj projekt sieci Web w taki sposób, aby używany był w nim program IIS oraz włącz monitorowanie hosta lokalnego (localhost) przy użyciu monitora ruchu HTTP. (Program Fiddler udostępnia np. adres URL serwera proxy, którym można zastąpić ciąg „localhost”, stanowiący wartość właściwości Start URL).

6. Wykonaj następujące działania i obserwuj wynikający ruch HTTP:

· Uruchom aplikację w programie Visual Studio.

· Naciśnij klawisz F5 w przeglądarce, aby ponownie wczytać stronę.

· Otwórz adres URL strony w innym oknie przeglądarki.

· Ponownie skompiluj rozwiązań w programie Visual Studio, a następnie ponownie wczytaj stronę w przeglądarce.

Po pierwszym pobraniu dodatkowe żądania pakietu aplikacji i plików biblioteki nie generują dodatkowego ruchu związanego z pobieraniem. Zamiast tego żądania są realizowane przy użyciu zbuforowanych kopii. Jednak ponowna kompilacja aplikacji powoduje wykrycie zmian i pobranie nowych kopii.

Jak to zrobić: wczytywanie zestawów na żądanie

Poniższy przykładowy kod ilustruje pobieranie zestawu z serwera-hosta na żądanie oraz wczytywanie zestawu do domeny bieżącej aplikacji.

W przykładzie użyto klasy WebClient (j.ang.) do inicjalizacji asynchronicznego pobierania zestawu w reakcji na kliknięcie myszą przez użytkownika. Po zakończeniu pobierania klasa AssemblyPart (j.ang.) jest używana do wczytania zestawu.

W tym przykładzie przyjmuje się, że w projekcie aplikacji dodano odwołanie do zestawu. Zestaw musi mieć też właściwość Copy Local o wartości False, co zapobiegnie jego wdrożeniu w pakiecie aplikacji. Więcej informacji można uzyskać w dokumencie Struktura aplikacji.

Technika ta umożliwia równieć wczytywanie zestawów, do których nie ma odwołań w projekcie aplikacji. W takim wypadku należy jednak użyć funkcji odbicia w celu utworzenia wystąpienia typów z wczytanego zestawu. Więcej informacji można uzyskać w dokumencie Assembly (j.ang.).

Przykład

Poniższy przykład powoduje wczytanie zestawu o nazwie SilverlightLibrary.dll po kliknięciu przez użytkownika bloku tekstu. W przykładzie użyto względnego identyfikatora URI w celu wczytania zestawu z tej samej lokalizacji, w której znajduje się plik xap aplikacji.

XML:

<UserControl x:Class="SilverlightApplication.HomePage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Grid Background="SandyBrown">
        <StackPanel x:Name="stackPanel">
            <TextBlock>Page from Host Application</TextBlock>
            <TextBlock 
                MouseLeftButtonUp="TextBlock_MouseLeftButtonUp"
                Cursor="Hand">
                Click Here to Display a UI from the Library Assembly
            </TextBlock>
        </StackPanel>
    </Grid>


</UserControl>

Visual Basic:

Imports SilverlightLibrary

Partial Public Class HomePage
    Inherits UserControl

    Public Sub New()
        InitializeComponent()
    End Sub

    Private Sub TextBlock_MouseLeftButtonUp(ByVal sender As Object, _
        ByVal e As MouseButtonEventArgs)

        ' Pobieranie zestawu "na życzenie". 
        Dim wc As New WebClient()
        AddHandler wc.OpenReadCompleted, AddressOf wc_OpenReadCompleted
        wc.OpenReadAsync(New Uri("SilverlightLibrary.dll", UriKind.Relative))

    End Sub

    Private Sub wc_OpenReadCompleted(ByVal sender As Object, _
        ByVal e As OpenReadCompletedEventArgs)

        If (e.[Error] Is Nothing) AndAlso (e.Cancelled = False) Then

            ' Przekształcenie pobranego strumienia w zestaw 
            ' wczytywany do bieżącej AppDomain. 
            Dim assemblyPart As New AssemblyPart()
            assemblyPart.Load(e.Result)

            DisplayPageFromLibraryAssembly()

        End If

    End Sub

    Private Sub DisplayPageFromLibraryAssembly()

        ' Tworzenie wystąpienia klasy Page w zestawie biblioteki. 
        Dim page As New Page()

        ' Wyświetlanie nowej strony. 
        Me.stackPanel.Children.Add(page)

    End Sub

End Class

C#:

using System; // Uri
using System.Net; // WebClient,OpenReadCompletedEventHandler
using System.Windows; // AssemblyPart
using System.Windows.Controls; // UserControl
using System.Windows.Input; // MouseButtonEventArgs
using SilverlightLibrary; // Page

namespace SilverlightApplication
{
    public partial class HomePage : UserControl
    {
        public HomePage()
        {
            InitializeComponent();
        }

        private void TextBlock_MouseLeftButtonUp(
            object sender, MouseButtonEventArgs e)
        {
            // Pobieranie zestawu "na życzenie".
            WebClient wc = new WebClient();
            wc.OpenReadCompleted += 
                new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
            wc.OpenReadAsync(
                new Uri("SilverlightLibrary.dll", UriKind.Relative));
        }

        private void wc_OpenReadCompleted(
            object sender, OpenReadCompletedEventArgs e)
        {
            if ((e.Error == null) && (e.Cancelled == false))
            {
                // Przekształcenie pobranego strumienia w zestaw
                // wczytywany do bieżącej AppDomain.
                AssemblyPart assemblyPart = new AssemblyPart();
                assemblyPart.Load(e.Result);

                DisplayPageFromLibraryAssembly();
            }
        }

        private void DisplayPageFromLibraryAssembly() {

            // Tworzenie wystąpienia klasy Page w zestawie biblioteki.
            Page page = new Page();

            // Wyświetlanie nowej strony. 
            this.stackPanel.Children.Add(page);
        }
    }
}

W celu wyświetlenia działającej wersji tego przykładu, kliknij łącze.