Sdílet prostřednictvím


Přidání obslužné rutiny 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 vlastní 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 za kódem. Například použijte kód v těchto případech:

  • Obslužnou rutinu události přiřadíte elementu za stránkou značek, která obsahuje načtení elementu.
  • 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.

Důležité

Dokumentace k desktopové příručce pro .NET 7 a .NET 6 se právě připravuje.

Předpoklady

V článku se předpokládá základní znalost směrovaných událostí a že jste si přečetli přehled směrovaný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é rutiny událostí pomocí:

Příklad

Následující příklad používá XAML k definování pojmenovaného ButtonButtonCreatedByXaml a přiřazení ButtonCreatedByXaml_Click metody jako jeho Click obslužné rutiny události. Click je integrovaná směrovaná událost pro tlačítka odvozená od 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 kód používá k implementaci ButtonCreatedByXaml_Click a ButtonCreatedByCode_Click obslužných rutin a k přiřazení ButtonCreatedByCode_Click obslužné rutiny k prvkům ButtonCreatedByCode a StackPanel1 prvkům. Metody obslužné rutiny událostí lze implementovat pouze v kódu.

// 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

Po ButtonCreatedByXaml kliknutí a spuštění ButtonCreatedByXaml_Click obslužné rutiny události programově:

  1. Přidá nové tlačítko pojmenované 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 ButtonCreatedByCode_Click události .ButtonCreatedByCode
  4. Přiřadí stejnou obslužnou ButtonCreatedByCode_Click rutinu události .StackPanel1

Po ButtonCreatedByCode kliknutí na:

  1. Směrovaná Click událost je vyvolána na ButtonCreatedByCode.
  2. Aktivuje se ButtonCreatedByCode_Click obslužná rutina události přiřazená ButtonCreatedByCode .
  3. Směrovaná Click událost prochází stromem elementu do StackPanel1.
  4. Aktivuje se ButtonCreatedByCode_Click obslužná rutina události přiřazená StackPanel1 .
  5. Směrovaná Click událost pokračuje ve stromu elementů, který potenciálně aktivuje další Click obslužné rutiny událostí přiřazené jiným procházeným prvkům.

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

  • Objekt odesílatele , což je prvek, ke kterému je přiřazena obslužná rutina události. ButtonCreatedByCode Bude sender prvním spuštěním obslužné rutiny a StackPanel1 druhým časem.
  • Objekt RoutedEventArgs.Source , což je prvek, který původně vyvolal událost. V tomto příkladu Source je 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 důsledku toho může být směrovaná událost sender libovolným procházeným prvkem ve stromu elementů.

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é