XAML - obsługa zdarzeń
Ogólna koncepcja zdarzeń w XAML jest podobna do zdarzeń w innych popularnych językach programowania, takich jak .NET i C ++. W języku XAML wszystkie kontrolki uwidaczniają niektóre zdarzenia, aby można je było subskrybować do określonych celów.
Za każdym razem, gdy ma miejsce zdarzenie, aplikacja zostanie o tym powiadomiona, a program będzie mógł na nie zareagować, np. Do zamknięcia okna służą przyciski zamykania.
Istnieje wiele typów zdarzeń, które można subskrybować dla różnych zachowań aplikacji w zależności od wymagań tej aplikacji, ale najczęściej używane są zdarzenia związane z myszą i klawiaturą, takie jak,
- Click
- MouseDown
- MouseEnter
- MouseLeave
- MouseUp
- KeyDown
- KeyUp
W tym rozdziale wykorzystamy niektóre z podstawowych i najczęściej używanych zdarzeń, aby zrozumieć, w jaki sposób zdarzenie określonej kontrolki może być połączone z kodem, za którym zaimplementowane zostanie zachowanie w zależności od tego, co użytkownik chce zrobić, gdy określone zdarzenie występuje.
Spójrzmy na prosty przykład zdarzenia kliknięcia przycisku. Poniżej podano implementację XAML dla kontrolki Button, która jest tworzona i inicjowana z niektórymi właściwościami i zdarzeniem Click (Click = "OnClick").
<Window x:Class = "XAMLEventHandling.MainWindow"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
Title = "MainWindow" Height = "350" Width = "604">
<Grid>
<Button x:Name = "button1" Content = "Click" Click = "OnClick"
Width = "150" Height = "30" HorizontalAlignment = "Center" />
</Grid>
</Window>
Każde kliknięcie tego przycisku spowoduje uruchomienie pliku OnClickzdarzenie i możesz dodać dowolny typ zachowania jako odpowiedź na kliknięcie. Przyjrzyjmy się implementacji zdarzenia OnClick, która wyświetli komunikat po kliknięciu tego przycisku.
using System;
using System.Windows;
using System.Windows.Controls;
namespace XAMLEventHandling {
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
private void OnClick(object sender, RoutedEventArgs e) {
MessageBox.Show("Button is clicked!");
}
}
}
Kiedy kompilujesz i wykonujesz powyższy kod, wygeneruje on następujący wynik -
Po kliknięciu przycisku zostanie uruchomione zdarzenie click (OnClick) i zostanie wyświetlony następujący komunikat.
Przyjrzyjmy się teraz nieco złożonemu przykładowi, w którym obsługiwanych jest wiele zdarzeń.
Przykład
Poniższy przykład zawiera pole tekstowe z ContextMenu, które manipuluje tekstem w polu tekstowym.
Poniższy kod XAML tworzy TextBox, ContextMenu i MenuItems z niektórymi właściwościami i zdarzeniami, takimi jak Checked, Unchecked i Click.
<Window x:Class = "XAMLContextMenu.MainWindow"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
Title = "MainWindow" Height = "350" Width = "604">
<Grid>
<TextBox Name = "textBox1" TextWrapping = "Wrap" Margin = "10" Grid.Row = "7">
Hi, this is XAML tutorial.
<TextBox.ContextMenu>
<ContextMenu>
<MenuItem Header = "_Bold" IsCheckable = "True"
Checked = "Bold_Checked" Unchecked = "Bold_Unchecked" />
<MenuItem Header = "_Italic" IsCheckable = "True"
Checked = "Italic_Checked" Unchecked = "Italic_Unchecked" />
<Separator />
<MenuItem Header = "Increase Font Size" Click = "IncreaseFont_Click" />
<MenuItem Header = "_Decrease Font Size" Click = "DecreaseFont_Click" />
</ContextMenu>
</TextBox.ContextMenu>
</TextBox>
</Grid>
</Window>
Oto implementacja w C # dla różnych zdarzeń, które będą uruchamiane za każdym razem, gdy element menu zostanie zaznaczony, odznaczony lub kliknięty.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
namespace XAMLContextMenu {
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
private void Bold_Checked(object sender, RoutedEventArgs e) {
textBox1.FontWeight = FontWeights.Bold;
}
private void Bold_Unchecked(object sender, RoutedEventArgs e) {
textBox1.FontWeight = FontWeights.Normal;
}
private void Italic_Checked(object sender, RoutedEventArgs e) {
textBox1.FontStyle = FontStyles.Italic;
}
private void Italic_Unchecked(object sender, RoutedEventArgs e) {
textBox1.FontStyle = FontStyles.Normal;
}
private void IncreaseFont_Click(object sender, RoutedEventArgs e) {
if (textBox1.FontSize < 18) {
textBox1.FontSize += 2;
}
}
private void DecreaseFont_Click(object sender, RoutedEventArgs e) {
if (textBox1.FontSize > 10) {
textBox1.FontSize -= 2;
}
}
}
}
Kiedy kompilujesz i wykonujesz powyższy kod, wygeneruje on następujący wynik -
Zalecamy wykonanie powyższego przykładowego kodu i eksperymentowanie z innymi zdarzeniami.
Wydarzenia
Sr.No. | Sterowanie i opis |
---|---|
1 | Checked Uruchamiany po zaznaczeniu ToggleButton. (Odziedziczone po ToggleButton) |
2 | Click Występuje po kliknięciu kontrolki przycisku. (Odziedziczone po ButtonBase) |
3 | ContextMenuClosing Występuje tuż przed zamknięciem dowolnego menu kontekstowego elementu. (Odziedziczone po FrameworkElement). |
4 | ContextMenuOpening Występuje po otwarciu dowolnego menu kontekstowego elementu. (Odziedziczone po FrameworkElement). |
5 | DataContextChanged Występuje po zmianie wartości właściwości FrameworkElement.DataContext. (Odziedziczone po FrameworkElement) |
6 | DragEnter Występuje, gdy system wejściowy zgłasza bazowe zdarzenie przeciągania z tym elementem jako celem. (Odziedziczone po UIElement). |
7 | DragLeave Występuje, gdy system wejściowy zgłasza bazowe zdarzenie przeciągania z tym elementem jako źródłem. (Odziedziczone po UIElement) |
8 | DragOver Występuje, gdy system wejściowy zgłasza bazowe zdarzenie przeciągania z tym elementem jako potencjalnym celem upuszczania. (Odziedziczone po UIElement) |
9 | DragStarting Występuje po zainicjowaniu operacji przeciągania. (Odziedziczone po UIElement) |
10 | DropCompleted Występuje po zakończeniu operacji przeciągania i upuszczania. (Odziedziczone po UIElement) |
11 | DropDownClosed Występuje po zamknięciu rozwijanej części ComboBox. |
12 | DropDownOpened Występuje, gdy zostanie otwarta rozwijana część ComboBox. |
13 | GotFocus Występuje, gdy element UIElement otrzyma fokus. (Odziedziczone po UIElement) |
14 | Holding Występuje, gdy w innym przypadku nieobsłużona interakcja Hold w obszarze testu trafień tego elementu. (Odziedziczone po UIElement) |
15 | Intermediate Pożary, gdy stan ToggleButton zostanie przełączony na stan nieokreślony. (Odziedziczone po ToggleButton) |
16 | IsEnabledChanged Występuje po zmianie właściwości IsEnabled. (Odziedziczone po Control) |
17 | KeyDown Występuje po naciśnięciu klawisza klawiatury, gdy element UIElement ma fokus. (Odziedziczone po UIElement) |
18 | KeyUp Występuje, gdy klawisz klawiatury zostanie wydany, gdy UIElement ma fokus. (Odziedziczone po UIElement) |
19 | LostFocus Występuje, gdy element UIElement traci fokus. (Odziedziczone po UIElement) |
20 | ManipulationCompleted Występuje po zakończeniu manipulacji na UIElement. (Odziedziczone po UIElement) |
21 | ManipulationDelta Występuje, gdy urządzenie wejściowe zmienia położenie podczas manipulacji. (Odziedziczone po UIElement) |
22 | ManipulationInertiaStarting Występuje, gdy urządzenie wejściowe traci kontakt z obiektem UIElement podczas manipulacji i rozpoczyna się bezwładność. (Odziedziczone po UIElement) |
23 | ManipulationStarted Występuje, gdy urządzenie wejściowe rozpoczyna manipulację na UIElement. (Odziedziczone po UIElement) |
24 | ManipulationStarting Występuje po pierwszym utworzeniu procesora manipulacji. (Odziedziczone po UIElement) |
25 | SelectionChanged Występuje po zmianie zaznaczenia tekstu. |
26 | SizeChanged Występuje, gdy właściwość ActualHeight lub ActualWidth zmieni wartość na FrameworkElement. (Odziedziczone po FrameworkElement) |
27 | Unchecked Występuje, gdy ToggleButton nie jest zaznaczone. (Odziedziczone po ToggleButton) |
28 | ValueChanged Występuje, gdy zmienia się wartość zakresu. (Odziedziczone po RangeBase) |