共用方式為


如何使用程式碼新增事件處理常式 (WPF .NET)

您可以使用標記或程式碼後置,將事件處理常式指派給 Windows Presentation Foundation (WPF) 中的元素。 雖然在 Extensible Application Markup Language (XAML) 中指派事件處理常式很尋常,但有時候您可能需要以程式碼後置的方式指派事件處理常式。 例如,在下列情況下使用程式碼:

  • 您在指派事件處理常式給元素之前,已先載入包含該元素的標記頁面。
  • 您在新增元素並指派其事件處理常式之前,已先載入將包含該元素的標記頁面。
  • 您可以在程式碼中完全定義應用程式的元素樹狀結構。

必要條件

本文假設您已基本了解路由事件,而且您已閱讀路由事件概觀。 若要遵循本文中的範例,建議您先熟悉 Extensible Application Markup Language (XAML),並了解如何撰寫 Windows Presentation Foundation (WPF) 應用程式。

事件處理常式指派語法

C# 支援使用下列來指派事件處理常式:

  • += 運算子,也用於通用語言執行平台 (CLR) 事件處理模型。
  • UIElement.AddHandler 方法。

Visual Basic 支援使用下列來指派事件處理常式:

範例

下列範例使用 XAML 來定義名為 ButtonCreatedByXamlButton,並將 ButtonCreatedByXaml_Click 方法指派為其 Click 事件處理常式。 Click 是衍生自 ButtonBase 之按鈕的內建路由事件。

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

此範例使用程式碼後置來實作 ButtonCreatedByXaml_ClickButtonCreatedByCode_Click 處理常式,並將 ButtonCreatedByCode_Click 處理常式指派給 ButtonCreatedByCodeStackPanel1 元素。 事件處理常式方法只能在程式碼後置中實作。

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

按一下 ButtonCreatedByXaml 並執行其事件處理常式時,ButtonCreatedByXaml_Click 會以程式設計方式:

  1. 將名為 ButtonCreatedByCode 的新按鈕新增至已建構的 XAML 元素樹狀結構中。
  2. 指定新按鈕的屬性,例如名稱、內容和背景色彩。
  3. ButtonCreatedByCode_Click 事件處理常式指派給 ButtonCreatedByCode
  4. 將相同的 ButtonCreatedByCode_Click 事件處理常式指派給 StackPanel1

按一下 ButtonCreatedByCode 時:

  1. ButtonCreatedByCode 上會引發 Click 路由事件。
  2. 觸發指派給 ButtonCreatedByCodeButtonCreatedByCode_Click 事件處理常式。
  3. Click 路由事件會沿著元素樹狀結構向上周游至 StackPanel1
  4. 觸發指派給 ButtonCreatedByCodeButtonCreatedByCode_Click 事件處理常式。
  5. Click 路由事件繼續沿著元素樹狀結構向上周遊,可能會觸發指派給其他周遊元素的其他 Click 事件處理常式。

ButtonCreatedByCode_Click 事件處理常式會取得其觸發事件的下列相關資訊:

  • 傳送者物件,事件處理常式指派給此元素。 第一次執行處理常式時,senderButtonCreatedByCode,第二次則為 StackPanel1
  • RoutedEventArgs.Source 物件,原本引發事件的元素。 在此範例中,Source 一律為 ButtonCreatedByCode

注意

路由事件與 CLR 事件之間的主要差異在於路由事件會周遊元素樹狀結構,尋找處理常式,而 CLR 事件不會周遊元素樹狀結構,且處理常式只能附加至引發事件的來源物件。 因此,路由事件 sender 可以是元素樹狀結構中的任何周遊元素。

如需如何建立及處理路由事件的詳細資訊,請參閱如何建立自訂路由事件處理路由事件

另請參閱