Obsługa zdarzeń w języku XAML

Ukończone

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:NameXAML . 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 Clickedzdarzenia , Pressedi 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) i EventArgs 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;

Test wiedzy

1.

Jakie parametry są przekazywane do metody obsługi zdarzeń?

2.

Którego operatora można użyć, aby połączyć program obsługi zdarzeń ze zdarzeniem w języku C#?