路由事件概觀 (WPF .NET)

Windows Presentation Foundation (WPF) 應用程式開發人員和元件作者可以使用路由事件,透過專案樹狀結構傳播事件,並在樹狀結構中的多個接聽程式上叫用事件處理常式。 在 Common Language Runtime (CLR) 事件中找不到這些功能。 數個 WPF 事件是路由事件,例如 ButtonBase.Click 。 本文討論基本的路由事件概念,並提供何時及如何回應路由事件的指引。

重要

.NET 7 和 .NET 6 的桌面指南檔正在建置中。

必要條件

本文假設通用語言執行平臺 (CLR)、物件導向程式設計的基本知識,以及如何 將 WPF 元素配置 概念化為樹狀結構。 若要遵循本文中的範例,如果您熟悉可延伸的應用程式標記語言(XAML),並知道如何撰寫 WPF 應用程式 ,它很有説明。

什麼是路由事件?

您可以從功能或實作的觀點考慮路由事件:

  • 從功能 的觀點來看,路由事件是一種事件種類,可以叫用元素樹狀結構中多個接聽程式上的處理常式,而不只是在事件來源上。 事件接聽程式是附加和叫用事件處理常式的專案。 事件來源是原本引發事件的專案或物件。

  • 從實 作的觀點來看,路由事件是向 WPF 事件系統註冊的事件,由 類別的 RoutedEvent 實例支援,並由 WPF 事件系統處理。 一般而言,路由事件是使用 CLR 事件「包裝函式」來實作,以啟用 XAML 和程式碼後置中的附加處理常式,就像 CLR 事件一樣。

WPF 應用程式通常包含許多元素,這些元素是在 XAML 中宣告或以程式碼具現化。 應用程式的專案存在於其專案樹狀結構中。 根據路由事件的定義方式,在來源元素上引發事件時:

  • 從來源元素到根項目的元素樹狀結構向上泡泡,通常是頁面或視窗。
  • 從根項目向下通道到來源元素的專案樹狀結構。
  • 不會穿過專案樹狀結構,而且只會發生在來源元素上。

請考慮下列部分專案樹狀結構:

<Border Height="30" Width="200" BorderBrush="Gray" BorderThickness="1">
    <StackPanel Background="LightBlue" Orientation="Horizontal" Button.Click="YesNoCancelButton_Click">
        <Button Name="YesButton">Yes</Button>
        <Button Name="NoButton">No</Button>
        <Button Name="CancelButton">Cancel</Button>
    </StackPanel>
</Border>

專案樹狀結構會轉譯,如下所示:

Yes, No, and Cancel buttons.

這三個按鈕中的每一個都是潛在的 Click 事件來源。 按一下其中一個按鈕時,它會引發 Click 從按鈕升起至根項目的事件。 ButtonBorder 元素沒有附加事件處理常式,但 StackPanel 會附加 。 樹狀結構中 Click 可能較高的其他元素也不會附加事件處理常式。 Click當事件到達 StackPanel 專案時,WPF 事件系統會 YesNoCancelButton_Click 叫用附加至它的處理常式。 此範例中的事件路由 Click 為: Button - >StackPanel - >Border - > 連續父元素。

注意

原本引發路由事件的專案會識別為 RoutedEventArgs.Source 事件處理常式參數中的 。 事件接聽程式是附加和叫用事件處理常式的專案,並識別為 事件處理常式參數中的傳送者

路由事件的最上層案例

以下是一些促使路由事件概念的案例,並區分它與典型的 CLR 事件:

  • 控制群組合和封裝 :WPF 中的各種控制項都有豐富的 con帳篷模式l。 例如,您可以將影像放在 內 Button ,以有效地擴充按鈕的視覺化樹狀結構。 但是,新增的影像不得中斷按鈕的點擊測試行為,使用者按一下影像圖元時需要回應。

  • 單一處理程式附件點 :您可以註冊每個按鈕 Click 事件的處理常式,但使用路由事件,您可以附加單一處理程式,如上一個 XAML 範例所示。 這可讓您變更單一處理程式底下的元素樹狀結構,例如新增或移除更多按鈕,而不需要註冊每個按鈕的事件 ClickClick引發事件時,處理常式邏輯可以判斷事件的來源。 在先前顯示的 XAML 元素樹狀結構中指定的下列處理常式包含該邏輯:

    private void YesNoCancelButton_Click(object sender, RoutedEventArgs e)
    {
        FrameworkElement sourceFrameworkElement = e.Source as FrameworkElement;
        switch (sourceFrameworkElement.Name)
        {
            case "YesButton":
                // YesButton logic.
                break;
            case "NoButton":
                // NoButton logic.
                break;
            case "CancelButton":
                // CancelButton logic.
                break;
        }
        e.Handled = true;
    }
    
    Private Sub YesNoCancelButton_Click(sender As Object, e As RoutedEventArgs)
        Dim frameworkElementSource As FrameworkElement = TryCast(e.Source, FrameworkElement)
    
        Select Case frameworkElementSource.Name
            Case "YesButton"
                ' YesButton logic.
            Case "NoButton"
                ' NoButton logic.
            Case "CancelButton"
                ' CancelButton logic.
        End Select
    
        e.Handled = True
    End Sub
    
  • 類別處理 :路由事件支援您在 類別中定義的類別事件處理常式 。 類別處理常式會在類別的任何實例上處理相同事件的任何實例處理常式之前處理事件。

  • 參考沒有反映 的事件:每個路由事件都會 RoutedEvent 建立欄位識別碼,以提供不需要靜態或執行時間反映來識別事件的強固事件識別技術。

如何實作路由事件

路由事件是向 WPF 事件系統註冊的事件,由 類別的 RoutedEvent 實例所支援,並由 WPF 事件系統處理。 RoutedEvent 註冊 取得的 實例通常會儲存為 public static readonly 註冊它的類別成員。 該類別稱為事件「擁有者」類別。 路由事件通常會實作同名 CLR 事件「包裝函式」。 CLR 事件包裝函式包含 addremove 存取子,可透過語言特定事件語法在 XAML 和程式碼後置中啟用附加處理常式。 addremove 存取子會覆寫其 CLR 實作,並呼叫路由事件 AddHandlerRemoveHandler 方法。 路由事件支援和連接機制在概念上與相依性屬性如何為 CLR 屬性類似,該屬性是由 DependencyProperty 類別所支援,並且向 WPF 屬性系統註冊。

下列範例會 Tap 註冊路由事件、儲存傳 RoutedEvent 回的實例,並實作 CLR 事件包裝函式。

// Register a custom routed event using the Bubble routing strategy.
public static readonly RoutedEvent TapEvent = EventManager.RegisterRoutedEvent(
    name: "Tap",
    routingStrategy: RoutingStrategy.Bubble,
    handlerType: typeof(RoutedEventHandler),
    ownerType: typeof(CustomButton));

// Provide CLR accessors for adding and removing an event handler.
public event RoutedEventHandler Tap
{
    add { AddHandler(TapEvent, value); }
    remove { RemoveHandler(TapEvent, value); }
}
' Register a custom routed event using the Bubble routing strategy.
Public Shared ReadOnly TapEvent As RoutedEvent = EventManager.RegisterRoutedEvent(
    name:="Tap",
    routingStrategy:=RoutingStrategy.Bubble,
    handlerType:=GetType(RoutedEventHandler),
    ownerType:=GetType(CustomButton))

' Provide CLR accessors for adding and removing an event handler.
Public Custom Event Tap As RoutedEventHandler
    AddHandler(value As RoutedEventHandler)
        [AddHandler](TapEvent, value)
    End AddHandler

    RemoveHandler(value As RoutedEventHandler)
        [RemoveHandler](TapEvent, value)
    End RemoveHandler

    RaiseEvent(sender As Object, e As RoutedEventArgs)
        [RaiseEvent](e)
    End RaiseEvent
End Event

路由策略

路由事件會使用下列其中一個路由傳送策略:

  • 布林 :一開始,會叫用事件來源上的事件處理常式。 路由事件接著會路由傳送至後續父元素,接著叫用其事件處理常式,直到到達元素樹狀目錄根目錄為止。 大部分的路由事件會使用事件反昇路由傳送策略。 反升路由事件通常用來報告複合控制項或其他 UI 元素的輸入或狀態變更。

  • 通道︰一開始會叫用元素樹狀結構根元素上的事件處理常式。 路由事件接著會路由傳送至後續子專案,接著叫用其事件處理常式,直到到達事件來源為止。 遵循通道路由的事件也稱為 預覽 事件。 WPF 輸入事件通常會實作為 預覽和反升配對

  • 直接 :只會叫用事件來源上的事件處理常式。 此非路由策略類似于 Windows Forms UI 架構事件,也就是標準 CLR 事件。 不同于 CLR 事件,直接路由事件支援 類別處理 ,而且可由 EventSetters EventTriggers 使用 。

為何要使用路由事件?

身為應用程式開發人員,您不一定需要知道或小心您正在處理的事件會實作為路由事件。 路由事件具有特殊行為,但如果您在引發該事件的專案上處理事件,該行為基本上是看不見的。 不過,當您想要將事件處理常式附加至父元素,以處理子項目所引發的事件,例如在複合控制項內,路由事件是相關的。

路由事件接聽程式不需要其處理的路由事件成為其類別的成員。 任何 UIElementContentElement 可以是任何路由事件的事件接聽程式。 由於視覺元素衍生自 UIElementContentElement ,因此您可以使用路由事件做為概念性的「介面」,以支援在應用程式中的不同專案之間交換事件資訊。 路由事件的「介面」概念特別適用于 輸入事件

路由事件支援在事件路由上的元素之間交換事件資訊,因為每個接聽程式都能夠存取相同的事件資料實例。 如果某個元素在事件資料中變更某個專案,事件路由中的後續元素就會看到該變更。

除了路由層面之外,您可以選擇實作路由事件,而不是標準 CLR 事件,原因如下:

  • 某些 WPF 樣式和範本化功能,例如 EventSetters EventTriggers ,需要參考的事件為路由事件。

  • 路由事件支援 類別事件處理常式,這些事件處理常式 會在接聽程式類別的任何實例上處理相同事件的任何實例處理常式之前處理事件。 這項功能在控制項設計中很有用,因為您的類別處理常式可以強制執行實例處理常式無法意外隱藏的事件驅動類別行為。

附加並實作路由事件處理常式

在 XAML 中,您可以將事件名稱宣告為事件接聽程式專案上的屬性,以將事件處理常式附加至專案。 屬性值是您處理常式方法名稱。 處理常式方法必須在 XAML 頁面的程式碼後置部分類別中實作。 事件接聽程式是附加和叫用事件處理常式的專案。

對於接聽程式類別的成員(繼承或其他)事件,您可以附加處理常式,如下所示:

<Button Name="Button1" Click="Button_Click">Click me</Button>

如果事件不是接聽程式類別的成員,您必須以 的形式 <owner type>.<event name> 使用限定的事件名稱。 例如,因為 類別 StackPanel 不會實 Click 作 事件,若要將處理常式附加至 StackPanelClick 會反升至該元素的事件,您必須使用限定的事件名稱語法:

<StackPanel Name="StackPanel1" Button.Click="Button_Click">
    <Button>Click me</Button>
</StackPanel>

程式碼後置中事件處理常式方法的簽章必須符合路由事件的委派類型。 事件的 sender 委派 Click 參數 RoutedEventHandler 會指定附加事件處理常式的專案。 委派 argsRoutedEventHandler 參數包含事件資料。 事件處理常式的相容程式碼後置實作 Button_Click 可能是:

private void Button_Click(object sender, RoutedEventArgs e)
{
    // Click event logic.
}
Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
    ' Click event logic.
End Sub

雖然 RoutedEventHandler 是基本的路由事件處理常式委派,但某些控制項或實作案例需要支援更特製化事件資料的不同委派。 例如,針對 DragEnter 路由事件,您的處理常式應該實 DragEventHandler 作委派。 如此一來,處理常式程式碼就可以存取 DragEventArgs.Data 事件資料中的 屬性,其中包含拖曳作業中的剪貼簿承載。

新增路由事件處理常式的 XAML 語法與標準 CLR 事件處理常式相同。 如需在 XAML 中新增事件處理常式的詳細資訊,請參閱 WPF 中的 XAML。 如需如何使用 XAML 將事件處理常式附加至元素的完整範例,請參閱 如何處理路由事件

若要使用程式碼將路由事件的事件處理常式附加至元素,您通常有兩個選項:

  • 直接呼叫 AddHandler 方法。 路由事件處理常式一律可以透過這種方式附加。 此範例會使用 AddHandler 方法,將事件處理常式附加 Click 至按鈕:

    Button1.AddHandler(ButtonBase.ClickEvent, new RoutedEventHandler(Button_Click));
    
    Button1.[AddHandler](ButtonBase.ClickEvent, New RoutedEventHandler(AddressOf Button_Click))
    

    若要將按鈕 Click 事件的處理常式附加至事件路由中的不同專案,例如 StackPanel 具名 StackPanel1 的 :

    StackPanel1.AddHandler(ButtonBase.ClickEvent, new RoutedEventHandler(Button_Click));
    
    StackPanel1.[AddHandler](ButtonBase.ClickEvent, New RoutedEventHandler(AddressOf Button_Click))
    
  • 如果路由事件實作 CLR 事件包裝函式,請使用語言特定的事件語法來新增事件處理常式,就像標準 CLR 事件一樣。 大部分現有的 WPF 路由事件會實作 CLR 包裝函式,從而啟用語言特定的事件語法。 此範例會使用語言特定語法,將事件處理常式附加 Click 至按鈕:

    Button1.Click += Button_Click;
    
    AddHandler Button1.Click, AddressOf Button_Click
    

如需如何在程式碼中附加事件處理常式的範例,請參閱 如何使用程式碼 新增事件處理常式。 如果您要在 Visual Basic 中撰寫程式碼,您也可以使用 Handles 關鍵字,將處理常式新增為處理常式宣告的一部分。 如需詳細資訊,請參閱 Visual Basic 和 WPF 事件處理

已處理的概念

所有路由事件都會共用事件資料的通用基類,也就是 類別 RoutedEventArgs 。 類別 RoutedEventArgs 會定義布林 Handled 屬性。 屬性的目的是 Handled 讓事件路由上的任何事件處理常式將路由事件標示為 已處理 。 若要將事件標示為已處理,請將 事件處理常式程式碼中的 值 Handled 設定為 true

的值 Handled 會影響路由事件在沿著事件路由移動時處理的方式。 如果 Handled 位於 true 路由事件的共用事件資料中,則附加至事件路由中其他元素的處理常式通常不會針對該特定事件實例叫用。 針對最常見的處理常式案例,將事件標示為已處理有效地會停止事件路由上的後續處理常式,無論是實例或類別處理常式,都無法回應該特定事件實例。 不過,在需要事件處理常式回應已標示為已處理之路由事件的罕見情況下,您可以:

的概念 Handled 可能會影響您設計應用程式和撰寫事件處理常式的程式碼。 您可以將概念化 Handled 為處理路由事件的簡單通訊協定。 使用此通訊協定的方式由您決定,但參數的預期用法 Handled 如下:

  • 如果路由事件標示為已處理,則不需要由路由上的其他元素再次處理。

  • 如果未將路由事件標示為已處理,則事件路由中稍早的接聽程式沒有事件的處理常式,或沒有任何已註冊的處理常式回應事件的方式,讓事件標示為已處理。 目前接聽程式的處理常式有三個可能的動作過程:

    • 完全不採取任何動作。 事件會保持未處理狀態,並路由傳送至樹狀結構中的下一個接聽程式。

    • 執行程式碼以回應事件,但不會在將事件標示為已處理的範圍。 事件會保持未處理狀態,並路由傳送至樹狀結構中的下一個接聽程式。

    • 執行程式碼以回應事件,以符合將事件標示為已處理的範圍。 將事件標示為事件資料中所處理。 事件仍會路由傳送至樹狀結構中的下一個接聽程式,但大多數接聽程式不會叫用進一步的處理常式。 例外狀況是具有已特別向 設定 true 為 註冊之處理常式的 handledEventsToo 接聽程式。

如需處理路由事件的詳細資訊,請參閱 將路由事件標示為已處理,以及類別處理

雖然只處理引發之物件上浮泡路由事件的開發人員可能不會擔心其他接聽程式,但最好還是將事件標示為已處理。 如果事件路由上的元素有相同路由事件的處理常式,則這樣做可防止非預期的副作用。

類別處理常式

路由事件處理常式可以是 實例 處理常式或 類別 處理常式。 指定類別的類別處理常式會在回應該類別的任何實例上回應相同事件的任何實例處理常式之前叫用。 由於此行為,當路由事件標示為已處理時,通常會在類別處理常式中標示為這類。 類別處理常式有兩種類型:

某些 WPF 控制項具有特定路由事件的固有類別處理。 類別處理可能會提供路由事件從未引發的外表,但實際上,它被標示為由類別處理常式處理。 如果您需要事件處理常式來回應已處理的事件,您可以向 註冊處理常式,並將 handledEventsToo 設定為 true 。 如需詳細資訊,請參閱將路由事件標示為已處理,以及類別處理

WPF 中的附加事件

XAML 語言也會定義稱為 附加事件 的特殊事件種類。 附加事件可用來在非元素類別中定義新的 路由事件 ,並在樹狀結構中的任何專案上引發該事件。 若要這樣做,您必須將附加事件註冊為路由事件,並提供支援附加事件功能的特定 支援程式碼 。 由於附加事件會註冊為路由事件,因此在專案上引發時,它們會透過專案樹狀結構傳播。

在 XAML 語法中,附加事件是由其事件名稱和 擁有者類型所指定,格式為 <owner type>.<event name> 。 因為事件名稱是以其擁有者類型的名稱 限定 ,因此語法可讓事件附加至任何可具現化的專案。 此語法也適用于附加至事件路由中任意元素之一般路由事件的處理常式。 您也可以在處理常式應該附加至的物件上呼叫 AddHandler 方法,在程式碼後置中附加事件的處理常式。

WPF 輸入系統會廣泛使用附加事件。 不過,幾乎所有附加事件都會透過基底元素呈現為相等的非附加路由事件。 您很少會直接使用或處理附加事件。 例如,透過對等 UIElement.MouseDown 路由事件在 上 UIElement 處理基礎附加 Mouse.MouseDown 事件比在 XAML 或程式碼後置中使用附加事件語法更容易。

如需 WPF 中附加事件的詳細資訊,請參閱 附加事件概觀

XAML 中的限定事件名稱

語法 <owner type>.<event name> 會使用其擁有者類型的名稱來限定事件名稱。 此語法可讓事件附加至任何專案,而不只是實作事件作為其類別成員的專案。 當附加事件或事件路由上任意元素上的路由事件 附加 XAML 中的處理常式時,語法就適用。 請考慮您想要將處理常式附加至父元素的案例,以處理子項目上引發的路由事件。 如果父元素沒有路由事件做為成員,您必須使用限定的事件名稱語法。 例如:

<StackPanel Name="StackPanel1" Button.Click="Button_Click">
    <Button>Click me</Button>
</StackPanel>

在此範例中,加入事件處理常式的父元素接聽程式是 StackPanel 。 不過, Click 路由事件會在 類別上 ButtonBase 實作和引發,並透過繼承提供給 Button 類別。 雖然類別 Button 「擁有」 Click 事件,但路由事件系統允許任何路由事件的處理常式附加至 UIElement 任何或 ContentElement 實例接聽程式,否則可能會有 CLR 事件的處理常式。 這些限定事件屬性名稱的預設 xmlns 命名空間通常是預設 WPF xmlns 命名空間,但您也可以為自訂路由事件指定前置命名空間。 如需 的詳細資訊 xmlns ,請參閱 WPF XAML 的 XAML 命名空間和命名空間對應。

WPF 輸入事件

WPF 平臺內路由事件的一個常見應用是輸入 事件 。 依照慣例,遵循通道路由的 WPF 路由事件具有前面加上 「Preview」 的名稱。 預覽前置詞表示預覽事件會在配對的反升事件開始之前完成。 輸入事件通常會成對,其中一個是預覽事件,另一個是反升路由事件。 例如,PreviewKeyDownKeyDown。 事件配對會共用相同的事件資料實例,而 和 PreviewKeyDownKeyDown 的類型為 KeyEventArgs 。 有時候,輸入事件只會有反升版本,或只有直接路由版本。 在 API 檔中,路由事件主題會跨參考路由事件組,並厘清每個路由事件的路由策略。

實作成對的 WPF 輸入事件,讓輸入裝置中的單一使用者動作,例如按滑鼠按鍵,會依序引發預覽和反升路由事件。 首先,會引發預覽事件並完成其路由。 在預覽事件完成時,會引發反升事件並完成其路由。 實 RaiseEvent 作類別中的 方法呼叫會引發反升事件,會重複使用來自預覽事件事件的事件資料,以進行反升事件。

標示為已處理的預覽輸入事件不會針對預覽路由的其餘部分叫用任何一般已註冊的事件處理常式,而且不會引發配對的反升事件。 此處理行為適用于複合控制項設計工具,其想要在其控制項的最上層報告點擊測試型輸入事件或以焦點為基礎的輸入事件。 控制項的最上層元素有機會從控制項子元件對預覽事件進行類別處理,以便以最上層控制項特定事件來「取代」它們。

若要說明輸入事件處理的運作方式,請考慮下列輸入事件範例。 在下列樹狀圖中, leaf element #2 是 和 MouseDown 配對事件的來源 PreviewMouseDown

Event routing diagram.

在分葉元素 #2 上執行滑鼠向下動作之後的事件處理順序為:

  1. PreviewMouseDown 根項目上的通道事件。
  2. PreviewMouseDown 中繼元素上的 tunneling 事件 #1。
  3. PreviewMouseDown 分葉元素 #2 上的 tunneling 事件,也就是來源專案。
  4. MouseDown 分葉元素 #2 上的浮點事件,這是來源元素。
  5. MouseDown 中繼元素上的浮點事件 #1。
  6. MouseDown 根項目上的浮點事件。

路由事件處理常式委派會提供引發 事件之 物件的參考,以及叫用處理程式的物件。 原本引發事件的物件是由 Source 事件資料中的 屬性所報告。 傳送者 參數會報告叫用 處理常式的物件。 對於任何指定的路由事件實例,引發事件的 物件不會隨著事件在元素樹狀結構中移動而變更,但 sender 會變更 。 在上圖的步驟 3 和 4 中, Sourcesender 是相同的 物件。

如果您的輸入事件處理常式完成處理事件所需的應用程式特定邏輯,您應該將輸入事件標示為已處理。 一般而言,一旦輸入事件標示 Handled 為 ,就不會叫用沿著事件路由進一步的處理常式。 不過,即使事件標示為已處理,也會叫用向 handledEventsToo 設定 true 為 的參數註冊的輸入事件處理常式。 如需詳細資訊,請參閱 預覽事件 將路由事件標示為已處理,以及類別處理

預覽和反升事件組的概念,具有共用事件資料和循序引發預覽事件,然後引發預覽事件,僅適用于某些 WPF 輸入事件,不適用於所有路由事件。 如果您實作自己的輸入事件來解決進階案例,請考慮遵循 WPF 輸入事件配對方法。

如果您要實作回應輸入事件的您自己的複合控制項,請考慮使用預覽事件來隱藏和取代子元件上引發的輸入事件,並取代為代表完整控制項的最上層事件。 如需詳細資訊,請參閱 將路由事件標示為已處理,以及類別處理

如需 WPF 輸入系統的詳細資訊,以及輸入和事件在一般應用程式案例中的互動方式,請參閱 輸入概觀

EventSetters 和 EventTriggers

在標記樣式中,您可以使用 來包含預先宣告的 XAML 事件處理語法 EventSetter 。 處理 XAML 時,參考的處理常式會新增至樣式實例。 您只能宣告 EventSetter 路由事件的 。 在下列範例中,參考 ApplyButtonStyle 的事件處理常式方法會在程式碼後置中實作。

<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="{x:Type Button}">
            <EventSetter Event="Click" Handler="ApplyButtonStyle"/>
        </Style>
    </StackPanel.Resources>
    <Button>Click me</Button>
    <Button Click="Button_Click">Click me</Button>
</StackPanel>

節點可能 Style 已經包含與指定型別控制項相關的其他樣式資訊,而且讓 EventSetter 這些樣式的一部分即使在標記層級上,也會促進程式碼重複使用。 此外,從 EventSetter 一般應用程式和頁面標記之外,抽象化處理常式的方法名稱。

另一個結合 WPF 路由事件和動畫功能的特殊語法是 EventTrigger 。 如同 , EventSetter 您只能宣告 EventTrigger 路由事件的 。 一般而言, EventTrigger 宣告為樣式的一部分,但 EventTrigger 可以在頁面層級專案上宣告為集合的 Triggers 一部分,或在 中 ControlTemplate 宣告 。 EventTrigger可讓您指定 Storyboard 每當路由事件到達其路由中宣告 EventTrigger 該事件的 時,所執行的 。 除了處理事件並導致它啟動現有的分鏡腳本之外, EventTrigger 的優點是 EventTrigger ,能夠更好地控制分鏡腳本及其執行時間行為。 如需詳細資訊,請參閱 在事件觸發程式啟動時 控制分鏡腳本。

深入瞭解路由事件

當在您自己的類別中建立自訂路由事件時,您可以使用本文中的概念和指引作為起點。 您也可以使用特製化事件資料類別和委派來支援自訂事件。 路由事件擁有者可以是任何類別,但路由事件必須由 或 ContentElement 衍生類別引發及處理 UIElement ,才能很有用。 如需自訂事件的詳細資訊,請參閱 建立自訂路由事件

另請參閱