Udostępnij za pośrednictwem


Omówienie programu Windows Presentation Foundation

Witamy w przewodniku dotyczącym aplikacji klasycznych Windows Presentation Foundation (WPF), struktury interfejsu użytkownika, która jest niezależna od rozdzielczości i używa aparatu renderowania opartego na wektorach, opracowanego w celu korzystania z nowoczesnego sprzętu graficznego. WPF zawiera kompleksowy zestaw funkcji programowania aplikacji, obejmujący między innymi język Extensible Application Markup Language (XAML), kontrolki, powiązanie danych, układ, grafikę 2D i 3D, animację, style, szablony, dokumenty, multimedia, tekst i typografię. WPF jest częścią platformy .NET, więc można tworzyć aplikacje, które zawierają inne elementy interfejsu API platformy .NET.

Istnieją dwie implementacje struktury WPF:

  1. Wersja dla platformy .NET (ten przewodnik):

    Implementacja open source platformy WPF hostowanej w usłudze GitHub, która działa na platformie .NET. Projektant XAML wymaga programu Visual Studio 2019 co najmniej w wersji 16.8. Jednak w zależności od używanej wersji platformy .NET może być wymagane użycie nowszej wersji programu Visual Studio.

    Mimo że platforma .NET jest technologią dla wielu platform, platforma WPF działa tylko w systemie Windows.

  2. Wersja dla platformy .NET Framework 4:

    Implementacja struktury WPF dla platformy .NET Framework obsługiwana przez programy Visual Studio 2019 i Visual Studio 2017.

    .NET Framework 4 jest wersją platformy .NET przeznaczoną tylko dla systemu Windows, która jest traktowana jak składnik systemu operacyjnego Windows. Ta wersja struktury WPF jest rozpowszechniana razem z platformą .NET Framework.

To omówienie jest przeznaczone dla początkujących i obejmuje kluczowe możliwości i pojęcia WPF. Aby dowiedzieć się, jak utworzyć aplikację WPF, zobacz Samouczek: Tworzenie nowej aplikacji WPF.

Dlaczego warto uaktualnić program .NET Framework

Podczas uaktualniania aplikacji z programu .NET Framework do platformy .NET będziesz korzystać z:

  • Lepsza wydajność
  • Nowe interfejsy API platformy .NET
  • Najnowsze ulepszenia języka
  • Ulepszona dostępność i niezawodność
  • Zaktualizowane narzędzia i inne

Aby dowiedzieć się, jak uaktualnić aplikację, zobacz Jak uaktualnić aplikację klasyczną WPF do platformy .NET.

Program z WPF

Struktura WPF istnieje jako podzestaw typów platformy .NET, które znajdują się głównie w przestrzeni nazw System.Windows. Użytkownicy, którzy kompilowali już wcześniej aplikacje na platformie .NET za pomocą takich struktur jak ASP.NET i Windows Forms, powinni już znać podstawowe środowisko programowania WPF:

  • Tworzenie wystąpień klas
  • Ustawianie właściwości
  • Wywoływanie metod
  • Obsługa zdarzeń

Struktura WPF zawiera dodatkowe konstrukcje programistyczne, które rozszerzają możliwości właściwości i zdarzeń: właściwości zależności i zdarzenia trasowane.

Znaczniki i kod-behind

Platforma WPF pozwala na rozwijanie aplikacji za pomocą znaczników i części kodu, co jest doświadczeniem, z którym deweloperzy ASP.NET powinni być zaznajomieni. Zazwyczaj używasz znaczniki XAML do implementowania wyglądu aplikacji, natomiast korzystasz z zarządzanych języków programowania (code-behind) w celu zaimplementowania ich zachowania. To rozdzielenie wyglądu i zachowania ma następujące korzyści:

  • Zmniejszenie kosztów programowania i konserwacji dzięki temu, że znaczniki specyficzne dla wyglądu nie są ściśle powiązane z kodem specyficznym dla zachowania.

  • Programowanie jest bardziej wydajne, ponieważ projektanci mogą implementować wygląd aplikacji jednocześnie z deweloperami, którzy implementują zachowanie aplikacji.

  • globalizacja i lokalizacja dla aplikacji WPF są uproszczone.

Znaczniki

XAML to język znaczników oparty na języku XML, który deklaratywnie implementuje wygląd aplikacji. Zazwyczaj służy do definiowania okien, okien dialogowych, stron i kontrolek użytkownika oraz wypełniania ich kontrolkami, kształtami i grafiką.

W poniższym przykładzie użyto języka XAML do zaimplementowania wyglądu okna zawierającego jeden przycisk:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    Title="Window with button"
    Width="250" Height="100">

  <!-- Add button to window -->
  <Button Name="button">Click Me!</Button>

</Window>

Konkretnie ten kod XAML definiuje okno i przycisk przy użyciu elementów Window i Button. Każdy element jest konfigurowany z atrybutami, takimi jak atrybut Window elementu Title, aby określić tekst paska tytułowego okna. W czasie wykonywania WPF konwertuje elementy i atrybuty zdefiniowane w znacznikach na wystąpienia klas WPF. Na przykład element Window jest konwertowany na wystąpienie klasy Window, której właściwość Title jest wartością atrybutu Title.

Na poniższej ilustracji przedstawiono interfejs użytkownika zdefiniowany przez kod XAML w poprzednim przykładzie:

Okno zawierające przycisk

Ponieważ język XAML jest oparty na kodzie XML, interfejs użytkownika, który jest komponowany z nim, jest składany w hierarchii zagnieżdżonych elementów, które są nazywane drzewem elementów. Drzewo elementów zapewnia logiczny i intuicyjny sposób tworzenia interfejsów użytkownika i zarządzania nimi.

Kod za stroną

Głównym zachowaniem aplikacji jest zaimplementowanie funkcji reagującej na interakcje użytkowników. Na przykład kliknięcie menu lub przycisku oraz wywołanie w odpowiedzi logiki biznesowej i logiki dostępu do danych. W WPF to zachowanie jest implementowane w kodzie skojarzonym z adiustacjami. Ten typ kodu jest znany jako kod-behind. W poniższym przykładzie pokazano zaktualizowany znacznik z poprzedniego przykładu i kod zaplecza:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.AWindow"
    Title="Window with button"
    Width="250" Height="100">

  <!-- Add button to window -->
  <Button Name="button" Click="button_Click">Click Me!</Button>

</Window>

Zaktualizowany znacznik definiuje przestrzeń nazw xmlns:x i mapuje ją na schemat dodający obsługę typów pliku codebehind. Do skojarzenia klasy pliku codebehind z tym konkretnym znacznikiem XAML służy atrybut x:Class. Biorąc pod uwagę, że ten atrybut jest zadeklarowany w elemecie <Window>, klasa pliku codebehind musi dziedziczyć z klasy Window.

using System.Windows;

namespace SDKSample
{
    public partial class AWindow : Window
    {
        public AWindow()
        {
            // InitializeComponent call is required to merge the UI
            // that is defined in markup with this class, including  
            // setting properties and registering event handlers
            InitializeComponent();
        }

        void button_Click(object sender, RoutedEventArgs e)
        {
            // Show message box when button is clicked.
            MessageBox.Show("Hello, Windows Presentation Foundation!");
        }
    }
}
Namespace SDKSample

    Partial Public Class AWindow
        Inherits System.Windows.Window

        Public Sub New()

            ' InitializeComponent call is required to merge the UI
            ' that is defined in markup with this class, including  
            ' setting properties and registering event handlers
            InitializeComponent()

        End Sub

        Private Sub button_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)

            ' Show message box when button is clicked.
            MessageBox.Show("Hello, Windows Presentation Foundation!")

        End Sub

    End Class

End Namespace

InitializeComponent jest wywoływane z konstruktora klasy code-behind, aby scalić interfejs użytkownika zdefiniowany w znacznikach z klasą code-behind. (Element InitializeComponent jest generowany dla Ciebie podczas kompilowania aplikacji, dlatego nie trzeba implementować go ręcznie). Kombinacja elementów x:Class i InitializeComponent zapewnia poprawne zainicjowanie implementacji po jej utworzeniu.

Zwróć uwagę, że element <Button> w znaczniku zdefiniował wartość button_Click atrybutu Click. Po zainicjowaniu i rozpoczęciu współpracy znacznika i pliku codebehind zdarzenie Click dotyczące przycisku jest automatycznie mapowane na metodę button_Click. Po kliknięciu przycisku jest wywoływana procedura obsługi zdarzeń, a wywołanie metody System.Windows.MessageBox.Show powoduje wyświetlenie pola komunikatu.

Na poniższej ilustracji przedstawiono wynik po kliknięciu przycisku:

Element MessageBox

Dane wejściowe i polecenia

Kontrolki najczęściej wykrywają dane wejściowe użytkownika i reagują na nie. System wprowadzania danych struktury WPF używa zarówno zdarzeń bezpośrednich, jak i trasowanych do obsługi wprowadzania tekstu, zarządzania fokusem i pozycjonowania myszy.

Aplikacje często mają złożone wymagania dotyczące danych wejściowych. Struktura WPF udostępnia system poleceń, który oddziela akcje wprowadzania danych przez użytkownika od kodu, który reaguje na te akcje. System poleceń umożliwia wywoływanie tej samej logiki poleceń przez wiele źródeł. Weźmy na przykład typowe operacje edycji używane przez różne aplikacje: kopiowanie, wycinanie i wklejanie. Te operacje można wywoływać przy użyciu różnych akcji użytkownika, jeśli są one zaimplementowane przy użyciu poleceń.

Sterowanie

Doświadczenia użytkownika dostarczane przez model aplikacji są zbudowanymi kontrolkami. W strukturze WPF kontrolka jest terminem ogólnym, który dotyczy kategorii klas WPF o następujących właściwościach:

  • Są hostowane w oknie lub na stronie.
  • Mają interfejs użytkownika.
  • Implementują jakieś zachowanie.

Aby uzyskać więcej informacji, zobacz Controls.

Kontrolki WPF według funkcji

Wbudowane kontrolki WPF są wymienione tutaj:

Układ

Podczas tworzenia interfejsu użytkownika kontrolki są rozmieszczane według lokalizacji i rozmiaru w celu utworzenia układu. Kluczowym wymaganiem każdego układu jest dostosowanie się do zmian rozmiaru okna i ustawień wyświetlania. Zamiast wymuszać pisanie kodu w celu dostosowania układu w tych okolicznościach, platforma WPF udostępnia najwyższej klasy, rozszerzalny system układów.

Podstawą systemu układu jest względne pozycjonowanie, co zwiększa możliwość dostosowania się do zmieniających się warunków okna i wyświetlania. System układu zarządza również negocjacjami między kontrolkami w celu określenia układu. Negocjacje są procesem dwuetapowym: najpierw kontrolka informuje swój element nadrzędny, jakiej lokalizacji i rozmiaru wymaga. Następnie element nadrzędny informuje kontrolkę, ile miejsca może zająć.

System układu jest uwidoczniony dla kontrolek podrzędnych za pomocą podstawowych klas WPF. W przypadku typowych układów, takich jak gridy, układanie i dokowanie, WPF zawiera kilka kontrolek układu:

  • Canvas: kontrolki podrzędne zapewniają własny układ.

  • DockPanel: Kontrolki podrzędne przylegają do krawędzi panelu.

  • Grid: Kontrolki dziecięce są rozmieszczane w wierszach i kolumnach.

  • StackPanel: Kontrolki podrzędne są ułożone w pionie lub w poziomie.

  • VirtualizingStackPanel: kontrolki podrzędne są zwirtualizowane i rozmieszczone w jednym wierszu, który jest zorientowany w poziomie lub w pionie.

  • WrapPanel: Kontrolki podrzędne są umieszczone w kolejności od lewej do prawej i opakowane do następnego wiersza, gdy nie ma wystarczającej ilości miejsca w bieżącym wierszu.

W poniższym przykładzie użyto DockPanel do utworzenia kilku kontrolek TextBox:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.LayoutWindow"
    Title="Layout with the DockPanel" Height="143" Width="319">

  <!--DockPanel to layout four text boxes-->
  <DockPanel>
    <TextBox DockPanel.Dock="Top">Dock = "Top"</TextBox>
    <TextBox DockPanel.Dock="Bottom">Dock = "Bottom"</TextBox>
    <TextBox DockPanel.Dock="Left">Dock = "Left"</TextBox>
    <TextBox Background="White">This TextBox "fills" the remaining space.</TextBox>
  </DockPanel>

</Window>

DockPanel pozwala kontrolkom podrzędnym TextBox określić, jak mają się rozmieścić. W tym celu DockPanel implementuje właściwość dołączoną Dock, udostępnianą kontrolkom podrzędnym, aby umożliwić każdej z nich określenie stylu dokowania.

Uwaga / Notatka

Właściwość implementowana przez kontrolkę nadrzędną do użycia przez kontrolki podrzędne to konstrukcja WPF nazywana dołączoną właściwością.

Na poniższym rysunku przedstawiono wynik znaczników XAML w poprzednim przykładzie.

Strona DockPanel

Powiązanie danych

Większość aplikacji jest tworzona w celu zapewnienia użytkownikom środków do wyświetlania i edytowania danych. W przypadku aplikacji WPF praca nad przechowywaniem danych i uzyskiwaniem do nich dostępu jest już wykonywana przez wiele różnych bibliotek dostępu do danych platformy .NET, takich jak SQL i Entity Framework Core. Po dokonaniu dostępu do danych i załadowaniu ich do zarządzanych obiektów aplikacji rozpoczyna się ciężka praca dla aplikacji WPF. Zasadniczo obejmuje to dwie rzeczy:

  1. Kopiowanie danych z zarządzanych obiektów do kontrolek, w których można wyświetlać i edytować dane.

  2. Zapewnienie, że zmiany wprowadzone w danych przy użyciu kontrolek są kopiowane z powrotem do zarządzanych obiektów.

Aby uprościć tworzenie aplikacji, struktura WPF udostępnia zaawansowany aparat powiązania danych, który umożliwia automatyczną obsługę tych kroków. Podstawową jednostką aparatu powiązania danych jest klasa Binding, której zadaniem jest powiązanie kontrolki (obiektu docelowego powiązania) z obiektem danych (źródłem powiązania). Ta relacja jest pokazana na poniższym rysunku:

Podstawowy diagram powiązań danych

Struktura WPF obsługuje deklarowanie powiązań bezpośrednio w znacznikach XAML. Na przykład poniższy kod XAML wiąże właściwość Text elementu TextBox z właściwością Name obiektu przy użyciu składni XAML „{Binding ... }”. Przyjęto założenie, że istnieje obiekt danych ustawiony na właściwość DataContext elementu Window za pomocą właściwości Name.

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

   <!-- Bind the TextBox to the data source (TextBox.Text to Person.Name) -->
   <TextBox Name="personNameTextBox" Text="{Binding Path=Name}" />

</Window>

Aparat powiązania danych WPF zapewnia nie tylko powiązanie, ale także walidację, sortowanie, filtrowanie i grupowanie. Ponadto powiązanie danych umożliwia korzystanie z szablonów danych do tworzenia niestandardowego interfejsu użytkownika dla powiązanych danych.

Aby uzyskać więcej informacji, zobacz omówienie powiązania danych .

Grafiki i animacja

Struktura WPF oferuje rozbudowany i elastyczny zestaw funkcji graficznych, które przynoszą następujące korzyści:

  • Grafika niezależna od rozdzielczości i od urządzenia. Podstawową jednostką pomiaru w systemie graficznym WPF jest niezależny od urządzenia piksel o rozmiarze 1/96 cala, który stanowi podstawę renderowania niezależnego od rozdzielczości i niezależnego od urządzenia. Każdy piksel niezależny od urządzenia jest automatycznie skalowany w celu dopasowania do ustawienia kropek na cal (dpi) systemu, na który jest renderowany.

  • ulepszona precyzja. Układ współrzędnych WPF jest mierzony przy użyciu liczb zmiennoprzecinkowych o podwójnej precyzji, a nie pojedynczej precyzji. Przekształcenia i wartości nieprzezroczystości są również wyrażane jako podwójna precyzja. Platforma WPF obsługuje również szeroką gamę kolorów (scRGB) i zapewnia zintegrowaną obsługę zarządzania danymi wejściowymi z różnych przestrzeni kolorów.

  • Obsługa zaawansowanej grafiki i animacji. Struktura WPF upraszcza programowanie grafiki, zarządzając scenami animacji za Ciebie; nie musisz martwić się o przetwarzanie scen, pętle renderowania i interpolację dwuliniową. Ponadto platforma WPF zapewnia obsługę testowania trafień i pełną obsługę komponowania alfa.

  • przyspieszanie sprzętowe. System graficzny WPF wykorzystuje sprzęt graficzny, aby zminimalizować użycie procesora CPU.

Grafika 2D

Struktura WPF udostępnia bibliotekę typowych kształtów wektorowych 2D, takich jak prostokąty i elipsy. Kształty te nie służą tylko do wyświetlania; implementują one wiele funkcji, których oczekujesz od kontrolek, w tym wprowadzanie danych za pomocą klawiatury i myszy.

Kształty 2D dostarczane przez WPF obejmują standardowy zestaw kształtów podstawowych. Jednak w celu ułatwienia projektowania dostosowanego interfejsu użytkownika może być konieczne utworzenie kształtów niestandardowych. Struktura WPF udostępnia geometrie do tworzenia niestandardowego kształtu, który może być rysowany bezpośrednio, używany jako pędzel lub używany do przycinania innych kształtów i kontrolek.

Aby uzyskać więcej informacji, zobacz omówienie geometrii .

Podzbiór funkcji WPF 2D obejmuje efekty wizualne, takie jak gradienty, mapy bitowe, rysunki, malowanie za pomocą wideo, rotacja, skalowanie i pochylenie. Wszystkie te efekty uzyskuje się za pomocą pędzli. Na poniższej ilustracji przedstawiono kilka przykładów:

Ilustracja przedstawiająca różne pędzle

Aby uzyskać więcej informacji, zobacz Pędzle WPF — omówienie.

Renderowanie 3D

WPF zawiera również funkcje renderowania 3D, które integrują się z grafiką 2D, aby umożliwić tworzenie bardziej ekscytujących i interesujących interfejsów użytkownika. Na przykład na poniższej ilustracji przedstawiono obrazy 2D renderowane na kształtach 3D:

Przykładowy zrzut ekranu Visual3D

Aby uzyskać więcej informacji, zobacz omówienie grafiki 3D .

Animacja

Obsługa animacji WPF umożliwia powiększanie, potrząsanie, obracanie i zanikanie kontrolek, aby tworzyć interesujące przejścia stron i nie tylko. Większość klas WPF można animować, nawet klas niestandardowych. Na poniższej ilustracji przedstawiono prostą animację w akcji:

Obrazy przedstawiające animowany sześcian

Aby uzyskać więcej informacji, zobacz omówienie animacji .

Tekst i typografia

Aby zapewnić wysokiej jakości renderowanie tekstu, struktura WPF oferuje następujące funkcje:

  • Obsługa czcionek OpenType.
  • Ulepszenia funkcji ClearType.
  • Wysoka wydajność, która korzysta z przyspieszania sprzętowego.
  • Integracja tekstu z multimediami, grafiką i animacją.
  • Międzynarodowe wsparcie czcionek i mechanizmy zapasowe.

W ramach pokazu integracji tekstu z grafiką na poniższej ilustracji przedstawiono zastosowanie dekoracji tekstu:

Tekst z różnymi dekoracjami

Aby uzyskać więcej informacji, zobacz Typography in Windows Presentation Foundation.

Dostosowywanie aplikacji WPF

Do tej pory przedstawiliśmy podstawowe bloki konstrukcyjne struktury WPF umożliwiające tworzenie aplikacji:

  • Model aplikacji służy do hostowania i dostarczania zawartości aplikacji, która składa się głównie z kontrolek.
  • W celu uproszczenia rozmieszczenia kontrolek w interfejsie użytkownika użyj systemu układu WPF.
  • Powiązanie danych pozwala zmniejszyć nakład pracy wymaganej do integracji interfejsu użytkownika z danymi.
  • Aby ulepszyć wygląd wizualizacji aplikacji, należy użyć kompleksowego zakresu obsługi grafiki, animacji i multimediów udostępnianych przez WPF.

Jednak często podstawowe funkcje nie wystarczają do tworzenia naprawdę wyróżniających się i wizualnie atrakcyjnych środowisk użytkownika oraz zarządzania nimi. Standardowe kontrolki WPF mogą nie być zintegrowane z żądanym wyglądem aplikacji. Dane mogą nie być wyświetlane w najbardziej efektywny sposób. Ogólne środowisko użytkownika aplikacji może nie być dostosowane do domyślnego wyglądu i działania motywów systemu Windows.

Z tego powodu struktura WPF udostępnia różne mechanizmy tworzenia unikatowych środowisk użytkownika.

Model zawartości

Głównym zadaniem większości kontrolek WPF jest wyświetlanie zawartości. W WPF typ i liczba elementów, które mogą stanowić zawartość kontrolki, jest określana jako model zawartości kontrolki. Niektóre kontrolki mogą zawierać pojedynczy element i typ zawartości. Na przykład zawartość obiektu TextBox jest wartością ciągu przypisaną do właściwości Text.

Jednak inne kontrolki mogą zawierać wiele elementów różnego typu zawartości; zawartość obiektu Button, określona przez właściwość Content, może zawierać różne elementy, w tym kontrolki układu, tekst, obrazy i kształty.

Aby uzyskać więcej informacji na temat rodzajów zawartości obsługiwanej przez różne kontrolki, zobacz model zawartości WPF.

Wyzwalaczy

Chociaż głównym celem znaczników XAML jest zaimplementowanie wyglądu aplikacji, można również użyć języka XAML do zaimplementowania niektórych aspektów zachowania aplikacji. Jednym z przykładów jest użycie wyzwalaczy w celu zmiany wyglądu aplikacji na podstawie interakcji użytkownika. Aby uzyskać więcej informacji, zobacz Style i szablony.

Szablony

Domyślne interfejsy użytkownika dla kontrolek WPF są zwykle tworzone z innych kontrolek i kształtów. Na przykład Button składa się zarówno z kontrolek ButtonChrome, jak i ContentPresenter. ButtonChrome zapewnia standardowy wygląd przycisku, a ContentPresenter wyświetla zawartość przycisku, jak określono we właściwości Content.

Czasami domyślny wygląd kontrolki może kolidować z ogólnym wyglądem aplikacji. W takim przypadku można użyć ControlTemplate, aby zmienić wygląd interfejsu użytkownika kontrolki bez zmiany jego zawartości i zachowania.

Na przykład element Button zgłasza zdarzenie Click po kliknięciu. Zmiana szablonu przycisku w celu wyświetlenia kształtu Ellipse powoduje zmianę aspektu wizualnego kontrolki, ale funkcjonalność pozostaje niezmieniona. Nadal możesz kliknąć aspekt wizualny kontrolki, a zdarzenie Click zostanie wywołane zgodnie z oczekiwaniami.

Owalny przycisk i drugie okno

Szablony danych

Szablon kontrolki umożliwia określenie wyglądu kontrolki, natomiast szablon danych umożliwia określenie wyglądu zawartości kontrolki. Szablony danych są często używane do ulepszania sposobu wyświetlania powiązanych danych. Na poniższej ilustracji przedstawiono domyślny wygląd ListBox, który jest powiązany z kolekcją obiektów Task, gdzie każde zadanie ma nazwę, opis i priorytet:

Pole listy o wyglądzie domyślnym

Domyślny wygląd to dokładnie to, czego można się spodziewać po ListBox. Jednak domyślny wygląd każdego zadania zawiera tylko nazwę zadania. Aby wyświetlić nazwę, opis i priorytet zadania, należy zmienić domyślny wygląd elementów listy powiązanej kontrolki ListBox przy użyciu DataTemplate. Oto przykład zastosowania szablonu danych utworzonego dla obiektu Task.

Pole listy używające szablonu danych

Element ListBox nie zmienia zachowania i wyglądu ogólnego — zmienia się tylko wygląd zawartości wyświetlanej przez pole listy.

Aby uzyskać więcej informacji, zobacz Omówienie tworzenia szablonów danych.

Style

Style umożliwiają deweloperom i projektantom standaryzację konkretnego wyglądu produktu. WPF zapewnia silny model stylu, którego podstawą jest element Style. Style mogą stosować wartości właściwości do typów. Można je stosować automatycznie do wszystkich elementów zgodnie z typem lub poszczególnych obiektów w przypadku odwołania. Poniższy przykład powoduje utworzenie stylu, który ustawia kolor tła dla każdego elementu Button w oknie na wartość Orange:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.StyleWindow"
    Title="Styles">

    <Window.Resources>
        <!-- Style that will be applied to all buttons for this window -->
        <Style TargetType="{x:Type Button}">
            <Setter Property="Background" Value="Orange" />
            <Setter Property="BorderBrush" Value="Crimson" />
            <Setter Property="FontSize" Value="20" />
            <Setter Property="FontWeight" Value="Bold" />
            <Setter Property="Margin" Value="5" />
        </Style>
    </Window.Resources>
    <StackPanel>

        <!-- This button will have the style applied to it -->
        <Button>Click Me!</Button>

        <!-- This label will not have the style applied to it -->
        <Label>Don't Click Me!</Label>

        <!-- This button will have the style applied to it -->
        <Button>Click Me!</Button>

    </StackPanel>
</Window>

Ponieważ ten styl jest przeznaczony dla wszystkich kontrolek Button, styl jest automatycznie stosowany do wszystkich przycisków w oknie, jak pokazano na poniższej ilustracji:

Dwa pomarańczowe przyciski

Aby uzyskać więcej informacji, zobacz Style i szablony.

Zasoby

Kontrolki w aplikacji powinny mieć taki sam wygląd, który może zawierać dowolne elementy od czcionek i kolorów tła do kontrolek szablonów, szablonów danych i stylów. Można użyć obsługi WPF dla zasobów interfejsu użytkownika, aby hermetyzować te zasoby w jednej lokalizacji do ponownego użycia.

W poniższym przykładzie zdefiniowano wspólny kolor tła współużytkowany przez Button i Label:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.ResourcesWindow"
    Title="Resources Window">

  <!-- Define window-scoped background color resource -->
  <Window.Resources>
    <SolidColorBrush x:Key="defaultBackground" Color="Red" />
  </Window.Resources>

  <!-- Button background is defined by window-scoped resource -->
  <Button Background="{StaticResource defaultBackground}">One Button</Button>

  <!-- Label background is defined by window-scoped resource -->
  <Label Background="{StaticResource defaultBackground}">One Label</Label>
</Window>

Aby uzyskać więcej informacji, zobacz Jak zdefiniować zasób WPF i odwoływać się do niego.

Kontrolki niestandardowe

Mimo że platforma WPF zapewnia obsługę dostosowywania, mogą wystąpić sytuacje, w których istniejące kontrolki WPF nie spełniają potrzeb aplikacji lub jej użytkowników. Taka sytuacja może wystąpić, gdy:

  • Nie można utworzyć wymaganego interfejsu użytkownika przez dostosowanie wyglądu i działania istniejących implementacji WPF.
  • Wymagane zachowanie nie jest obsługiwane (lub nie jest obsługiwane w łatwy sposób) przez istniejące implementacje WPF.

W tym momencie można jednak skorzystać z jednego z trzech modeli WPF, aby utworzyć nową kontrolkę. Każdy model jest przeznaczony dla określonego scenariusza i wymaga, aby kontrolka niestandardowa pochodziła z konkretnej klasy bazowej WPF. Trzy modele są wymienione tutaj:

  • Model kontrolki użytkownika
    Kontrolka niestandardowa pochodzi z UserControl i składa się z co najmniej jednej innej kontrolki.

  • Model kontrolki Kontrolka niestandardowa pochodzi od elementu Control i służy do kompilowania implementacji, które oddzielają ich zachowanie od wyglądu przy użyciu szablonów, podobnie jak w przypadku większości kontrolek WPF. Wyprowadzanie z Control zapewnia większą swobodę tworzenia niestandardowego interfejsu użytkownika niż kontrolki użytkownika, ale może wymagać większego nakładu pracy.

  • Model elementu frameworka.
    Kontrolka niestandardowa pochodzi z FrameworkElement, gdy jej wygląd jest definiowany przez niestandardową logikę renderowania (a nie szablony).

Aby uzyskać więcej informacji na temat kontrolek niestandardowych, zobacz Omówienie tworzenia kontrolek.

Zobacz także