Sdílet prostřednictvím


Jak přidat obslužnou rutinu události pomocí kódu (WPF .NET)

Obslužnou rutinu události můžete přiřadit elementu ve Windows Presentation Foundation (WPF) pomocí značek nebo kódu na pozadí. I když je obvyklé přiřadit obslužnou rutinu události v XAML (Extensible Application Markup Language), někdy může být nutné přiřadit obslužnou rutinu události v kódu na pozadí. Například použijte kód v těchto případech:

  • Přiřadíte obslužnou rutinu události elementu poté, co se načte stránka se značkami, která obsahuje tento element.
  • Přidáte prvek a přiřadíte jeho obslužnou rutinu události za stránku značek, která bude obsahovat načtení elementu.
  • Strom elementů pro vaši aplikaci definujete zcela v kódu.

Požadavky

Tento článek předpokládá základní znalost trasovaných událostí a že jste si přečetli přehled trasovaných událostí. Pokud chcete postupovat podle příkladů v tomto článku, pomůže vám to, pokud znáte jazyk XAML (Extensible Application Markup Language) a víte, jak psát aplikace WINDOWS Presentation Foundation (WPF).

Syntaxe přiřazení obslužné rutiny události

Jazyk C# podporuje přiřazení obslužné rutiny události pomocí:

  • Operátor +=, který se používá také v modelu zpracování událostí CLR (Common Language Runtime).
  • Metoda UIElement.AddHandler.

VB podporuje přiřazení obslužných rutin událostí pomocí:

Příklad

Následující příklad používá XAML k definování Button pojmenované ButtonCreatedByXaml a k přiřazení metody ButtonCreatedByXaml_Click jako své Click obslužné rutiny události. Click je integrovaná řízená událost pro tlačítka, která jsou odvozena z ButtonBase.

<StackPanel Name="StackPanel1">
    <Button
        Name="ButtonCreatedByXaml" 
        Click="ButtonCreatedByXaml_Click"
        Content="Create a new button with an event handler"
        Background="LightGray">
    </Button>
</StackPanel>

V příkladu se technika code-behind používá k implementaci obslužných rutin ButtonCreatedByXaml_Click a ButtonCreatedByCode_Click a k přiřazení obslužné rutiny ButtonCreatedByCode_Click prvkům ButtonCreatedByCode a StackPanel1. Metody obslužné rutiny událostí lze implementovat pouze v kódu na pozadí.

// The click event handler for the existing button 'ButtonCreatedByXaml'.
private void ButtonCreatedByXaml_Click(object sender, RoutedEventArgs e)
{
    // Create a new button.
    Button ButtonCreatedByCode = new();

    // Specify button properties.
    ButtonCreatedByCode.Name = "ButtonCreatedByCode";
    ButtonCreatedByCode.Content = "New button and event handler created in code";
    ButtonCreatedByCode.Background = Brushes.Yellow;

    // Add the new button to the StackPanel.
    StackPanel1.Children.Add(ButtonCreatedByCode);

    // Assign an event handler to the new button using the '+=' operator.
    ButtonCreatedByCode.Click += new RoutedEventHandler(ButtonCreatedByCode_Click);

    // Assign an event handler to the new button using the AddHandler method.
    // AddHandler(ButtonBase.ClickEvent, new RoutedEventHandler(ButtonCreatedByCode_Click);

    // Assign an event handler to the StackPanel using the AddHandler method.
    StackPanel1.AddHandler(ButtonBase.ClickEvent, new RoutedEventHandler(ButtonCreatedByCode_Click));
}

// The Click event handler for the new button 'ButtonCreatedByCode'.
private void ButtonCreatedByCode_Click(object sender, RoutedEventArgs e)
{
    string sourceName = ((FrameworkElement)e.Source).Name;
    string senderName = ((FrameworkElement)sender).Name;

    Debug.WriteLine($"Routed event handler attached to {senderName}, " +
        $"triggered by the Click routed event raised by {sourceName}.");
}
' The click event handler for the existing button 'ButtonCreatedByXaml'.
Private Sub ButtonCreatedByXaml_Click(sender As Object, e As RoutedEventArgs)

    ' Create a new button and specify button properties.
    Dim ButtonCreatedByCode As New Button With {
        .Name = "ButtonCreatedByCode",
        .Content = "New button and event handler created in code",
        .Background = Brushes.Yellow
    }

    ' Add the new button to the StackPanel.
    StackPanel1.Children.Add(ButtonCreatedByCode)

    ' Assign an event handler to the new button using the AddHandler statement.
    AddHandler ButtonCreatedByCode.Click, AddressOf ButtonCreatedByCode_Click

    ' Assign an event handler to the new button using the AddHandler method.
    ' ButtonCreatedByCode.AddHandler(ButtonBase.ClickEvent, New RoutedEventHandler(AddressOf ButtonCreatedByCode_Click))

    ' Assign an event handler to the StackPanel using the AddHandler method.
    StackPanel1.AddHandler(ButtonBase.ClickEvent, New RoutedEventHandler(AddressOf ButtonCreatedByCode_Click))

End Sub

' The Click event handler for the new button 'ButtonCreatedByCode'.
Private Sub ButtonCreatedByCode_Click(sender As Object, e As RoutedEventArgs)

    Dim sourceName As String = CType(e.Source, FrameworkElement).Name
    Dim senderName As String = CType(sender, FrameworkElement).Name

    Debug.WriteLine($"Routed event handler attached to {senderName}, " +
        $"triggered by the Click routed event raised by {sourceName}.")

End Sub

Když je kliknuto na ButtonCreatedByXaml a jeho obslužná rutina události se spustí, ButtonCreatedByXaml_Click je spuštěno programově:

  1. Přidá nové tlačítko s názvem ButtonCreatedByCode do již vytvořeného stromu elementů XAML.
  2. Určuje vlastnosti nového tlačítka, například název, obsah a barvu pozadí.
  3. Přiřadí obslužnou rutinu události ButtonCreatedByCode_Click k ButtonCreatedByCode.
  4. Přiřadí stejnou obslužnou rutinu události ButtonCreatedByCode_Click ke StackPanel1.

Po kliknutí na ButtonCreatedByCode:

  1. Směrovaná událost Click je vyvolána na ButtonCreatedByCode.
  2. Obslužná rutina události ButtonCreatedByCode_Click přiřazená k ButtonCreatedByCode je spuštěna.
  3. Směrovaná událost Click prochází stromem prvků k StackPanel1.
  4. Obslužná rutina události ButtonCreatedByCode_Click, přiřazená k StackPanel1, je spuštěna.
  5. Směrovaná událost Click pokračuje po stromu elementů směrem nahoru, čímž může potenciálně aktivovat další obslužné rutiny událostí Click přiřazené jiným procházeným prvkům.

Obslužná rutina události ButtonCreatedByCode_Click získá následující informace o události, která ji aktivovala:

  • Odesílatelský objekt , což je prvek, ke kterému je přiřazena obslužná rutina události. Ty sender bude ButtonCreatedByCode poprvé, když se spustí obslužná rutina, a StackPanel1 podruhé.
  • Objekt RoutedEventArgs.Source, což je prvek, který původně vyvolal událost. V tomto příkladu je Source vždy ButtonCreatedByCode.

Poznámka

Klíčovým rozdílem mezi směrovanou událostí a událostí CLR je to, že směrovaná událost prochází strom prvků, hledá obslužné rutiny, zatímco událost CLR neprochází stromem elementu a obslužné rutiny se můžou připojit pouze ke zdrojovému objektu, který vyvolal událost. Výsledkem je, že směrovaná událost sender může být jakýkoliv prvek, který je procházen ve stromu prvků.

Další informace o vytváření a zpracování směrovaných událostí naleznete v tématu Vytvoření vlastní směrované události a Zpracování směrované události.

Viz také