Obsługa zdarzeń w języku XAML
Po utworzeniu interfejsu użytkownika XAML możesz dodać kod w celu reagowania na interakcje występujące podczas odwiedzania strony przez użytkownika. Program .NET MAUI powiadamia aplikację danych wejściowych i interakcji użytkownika za pośrednictwem standardowych zdarzeń platformy .NET.
W tej lekcji dowiesz się, jak obsługiwać te zdarzenia i wykonywać operacje oczekiwane przez użytkownika.
Nazewnictwo elementów na stronie XAML
Kod obsługi zdarzeń często musi odwoływać się do określonych kontrolek i ich właściwości na stronie. Do każdej kontrolki można przypisać unikatową nazwę. W tym celu użyj atrybutu x:Name
XAML . Atrybut x:Name
wykonuje dwie rzeczy:
Dodaje ono pole prywatne do wygenerowanego pliku kodu zamapowanego na ten element. Użyj tego pola w kodzie, aby wchodzić w interakcje z elementem wizualizacji, aby ustawić właściwości środowiska uruchomieniowego i obsługiwać zdarzenia.
Spowoduje to, że element jest znany XAML za pomocą tej nazwy. Można odwoływać się do tych elementów z innych elementów zdefiniowanych w tym samym pliku XAML.
Nie można użyć żadnego dowolnego ciągu podczas nadawania nazwy elementowi. Wartość przypisana do atrybutu x:Name
służy do tworzenia pola w kodzie. Zamiast tego musi być zgodna z konwencjami nazewnictwa dla zmiennej. Nazwa musi być również unikatowa, ponieważ jest ona kompilowana w definicji kodu.
Po podaniu nazwy elementu można wchodzić w interakcje z tym elementem w pliku za pomocą kodu. Poniższy fragment XAML definiuje kontrolkę Label
. Nosi on nazwę CounterLabel (ten przykład jest pobierany z domyślnej aplikacji generowanej przez szablon MAUI platformy .NET):
<Label Text="Current count: 0"
...
x:Name="CounterLabel"
... />
W kodzie tej strony możesz odwołać się do tej kontrolki za pomocą CounterLabel
pola i zmodyfikować jego właściwości:
count++;
CounterLabel.Text = $"Current count: {count}";
Ważne
Pole nie zostanie zainicjowane do momentu InitializeComponent
uruchomienia metody strony. Ta metoda jest częścią procesu analizowania kodu XAML i tworzenia wystąpienia obiektu. Umieść dowolny kod, który wchodzi w interakcję z elementem zdefiniowanym w języku XAML po tym wywołaniu. Wyjątkiem od tej reguły jest ContentPage
sama klasa. Przed wykonaniem InitializeComponent
metody można uzyskać dostęp do wszystkich właściwości klasy. Jeśli jednak ustawisz jakiekolwiek właściwości tej klasy w języku XAML, te wartości właściwości zastąpią wszystkie wartości, które mogły zostać ustawione przed wykonaniem polecenia InitializeComponent
.
Używanie atrybutu do podłączania zdarzeń
Wiele kontrolek uwidacznia właściwości, które odpowiadają zdarzeniu, na które te kontrolki mogą reagować, na przykład Clicked
zdarzenie przycisku. Różne kontrolki obsługują różne zestawy zdarzeń. Na przykład kontrolka Button
może reagować na Clicked
zdarzenia , Pressed
i Released
, a kontrolka Entry
ma zdarzenia takie jak TextChanged
. Właściwość zdarzenia można zainicjować w znaczniku XAML strony i określić nazwę metody do uruchomienia po wyzwoleniu zdarzenia. Metoda zdarzenia musi spełniać następujące wymagania dotyczące podpisu:
- Nie może zwrócić wartości; metoda musi mieć wartość
void
. - Musi on przyjmować dwa parametry; odwołanie
object
wskazujące obiekt, który wyzwolił zdarzenie (znane jako nadawca) iEventArgs
parametr zawierający wszystkie argumenty przekazane do procedury obsługi zdarzeń przez nadawcę. - Procedura obsługi zdarzeń powinna mieć wartość
private
. Nie jest to wymuszane, ale jeśli upublicznisz program obsługi zdarzeń, stanie się dostępny dla świata zewnętrznego, a akcja inna niż oczekiwane wyzwalane zdarzenie może wywołać. - Program obsługi zdarzeń może być
async
, jeśli musi uruchamiać operacje asynchroniczne.
W poniższym przykładzie przedstawiono definicję Clicked
procedury obsługi zdarzeń dla przycisku w przykładowej aplikacji z szablonu .NET MAUI. Nazwa metody jest zgodna ze standardową konwencją; Następnie nazwa kontrolki (przycisk ma nazwę Counter) i nazwę zdarzenia (kliknięta). Ta konwencja nie jest wymuszana, ale jest dobrym rozwiązaniem:
private void OnCounterClicked(object sender, EventArgs e)
{
...
}
Separacja obaw
Podłączanie zdarzeń w języku XAML jest wygodne, ale miesza zachowanie kontrolki z definicją interfejsu użytkownika. Wielu deweloperów woli zachować te elementy odrębne i wykonywać wszystkie subskrypcje programu obsługi zdarzeń w kodzie do nazwanych elementów. Łatwiej jest zobaczyć, co jest podłączone i gdzie jest mapowane zachowanie. Ta metoda utrudnia również przypadkowe przerwanie kodu przez usunięcie programu obsługi w języku XAML bez jego zrozumienia. Kompilator nie przechwyci usuniętej procedury obsługi i stanie się problemem tylko wtedy, gdy kod nie wykonuje tego zachowania prawidłowo.
Niezależnie od tego, czy chcesz połączyć programy obsługi zdarzeń przy użyciu języka XAML, czy przy użyciu kodu, jest kwestią wyboru osobistego.
Aby połączyć program obsługi zdarzeń w kodzie, użyj +=
operatora , aby zasubskrybować zdarzenie. Zazwyczaj wykonujesz tę operację w konstruktorze dla strony po wywołaniu metody InitializeComponent
:
public partial class MainPage : ContentPage, IPage
{
public MainPage()
{
InitializeComponent();
Counter.Clicked += OnCounterClicked;
}
...
private void OnCounterClicked(object sender, EventArgs e)
{
...
}
}
Uwaga
Tej metody można użyć do subskrybowania wielu metod obsługi zdarzeń dla tego samego zdarzenia. Każda metoda obsługi zdarzeń jest uruchamiana w momencie wystąpienia zdarzenia, chociaż nie należy zakładać, że zostaną one wykonane w określonej kolejności, więc nie wprowadzaj żadnych zależności między nimi.
Podobnie można usunąć procedurę obsługi zdarzeń, anulując subskrypcję z zdarzenia za pomocą -=
operatora w dalszej części aplikacji:
Counter.Clicked -= OnCounterClicked;