Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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:
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.
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:
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:
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:
Przyciski: Button i RepeatButton.
wyświetlanie i wybieraniedaty: Calendar i DatePicker.
okna dialogowe : OpenFileDialog, PrintDialogi SaveFileDialog.
Digital Ink: InkCanvas i InkPresenter.
Documents: DocumentViewer, FlowDocumentPageViewer, FlowDocumentReader, FlowDocumentScrollVieweri StickyNoteControl.
input: TextBox, RichTextBoxi PasswordBox.
Layout: Border, BulletDecorator, Canvas, DockPanel, Expander, Grid, GridView, GridSplitter, GroupBox, Panel, ResizeGrip, Separator, ScrollBar, ScrollViewer, StackPanel, Thumb, Viewbox, VirtualizingStackPanel, Windowi WrapPanel.
Media: Image, MediaElementi SoundPlayerAction.
Menu : ContextMenu, Menui ToolBar
nawigacja: Frame, Hyperlink, Page, NavigationWindowi TabControl.
Wybór: CheckBox, ComboBox, ListBox, RadioButtoni Slider.
informacje o użytkowniku: AccessText, Label, Popup, ProgressBar, StatusBar, TextBlocki ToolTip.
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.
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:
Kopiowanie danych z zarządzanych obiektów do kontrolek, w których można wyświetlać i edytować dane.
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:
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:
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:
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:
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:
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.
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:
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
.
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:
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
.NET Desktop feedback