Dela via


Lägga till en händelsehanterare med hjälp av kod (WPF .NET)

Du kan tilldela en händelsehanterare till ett element i Windows Presentation Foundation (WPF) med hjälp av markering eller kod bakom. Även om det är vanligt att tilldela en händelsehanterare i XAML (Extensible Application Markup Language) kan du ibland behöva tilldela en händelsehanterare i kod bakom. Använd till exempel kod när:

  • Du tilldelar en händelsehanterare till ett element efter markup-sidan som innehåller elementet när den läses in.
  • Du lägger till ett element och tilldelar dess händelsehanterare efter att markeringssidan som ska innehålla elementet har laddats.
  • Du definierar elementträdet för ditt program helt i kod.

Förutsättningar

Artikeln förutsätter grundläggande kunskaper om routade händelser och att du har läst Översikt över routade händelser. Om du vill följa exemplen i den här artikeln hjälper det om du är bekant med XAML (Extensible Application Markup Language) och vet hur du skriver WPF-program (Windows Presentation Foundation).

Syntax för händelsehanterartilldelning

C# stöder händelsehanterartilldelning med hjälp av:

  • Operatorn +=, som också används i CLR-händelsehanteringsmodellen.
  • Metoden UIElement.AddHandler.

VB stöder händelsehanterartilldelning med hjälp av:

Exempel

I följande exempel används XAML för att definiera en Button med namnet ButtonCreatedByXaml och tilldela metoden ButtonCreatedByXaml_Click som dess Click händelsehanterare. Click är en inbyggd ruterad händelse för knappar som härleds från ButtonBase.

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

I exemplet används kod bakom för att implementera ButtonCreatedByXaml_Click- och ButtonCreatedByCode_Click-hanterare och för att tilldela ButtonCreatedByCode_Click-hanteraren till elementen ButtonCreatedByCode och StackPanel1. Händelsehanterarmetoder kan bara implementeras i code-behind.

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

När ButtonCreatedByXaml klickas på och dess händelsehanterare körs, kör ButtonCreatedByXaml_Click programmatiskt.

  1. Lägger till en ny knapp med namnet ButtonCreatedByCode i det redan konstruerade XAML-elementträdet.
  2. Anger egenskaper för den nya knappen, till exempel namn, innehåll och bakgrundsfärg.
  3. Tilldelar händelsehanteraren ButtonCreatedByCode_Click till ButtonCreatedByCode.
  4. Tilldelar samma ButtonCreatedByCode_Click händelsehanterare till StackPanel1.

När ButtonCreatedByCode klickas:

  1. Den Click dirigerade händelsen aktiveras på ButtonCreatedByCode.
  2. Den ButtonCreatedByCode_Click händelsehanterare som tilldelats ButtonCreatedByCode utlöses.
  3. Den Click dirigerade händelsen rör sig uppför elementträdet till StackPanel1.
  4. Den ButtonCreatedByCode_Click händelsehanterare som tilldelats StackPanel1 utlöses.
  5. Den Click routed händelsen fortsätter upp i elementträdet och utlöser potentiellt andra Click händelsehanterare som tilldelats andra genomgångna element.

Händelsehanteraren för ButtonCreatedByCode_Click hämtar följande information om händelsen som utlöste den:

  • Avsändarobjektet , vilket är det element som händelsehanteraren har tilldelats. sender ButtonCreatedByCode första gången hanteraren körs och StackPanel1 andra gången.
  • RoutedEventArgs.Source objektet, som är det element som ursprungligen utlöste händelsen. I det här exemplet är Source alltid ButtonCreatedByCode.

Not

En viktig skillnad mellan en dirigerad händelse och en CLR-händelse är att en dirigerad händelse passerar elementträdet och letar efter hanterare, medan en CLR-händelse inte passerar elementträdet och hanterare bara kan ansluta till källobjektet som skapade händelsen. Det innebär att en dirigerad händelse sender kan vara vilket som helst genomgånget element i trädet.

Mer information om hur du skapar och hanterar routade händelser finns i Så här skapar du en anpassad dirigerad händelse och Hantera en dirigerad händelse.

Se även