觸發程序概觀

本頁僅適用 WPF 專案

Cc294856.alert_note(zh-tw,Expression.10).gif注意事項:

Microsoft Silverlight 1.0 或 Silverlight 2 專案不支援觸發程序。Silverlight 1.0 應用程式中的所有使用者互動,皆由事件處理常式所完成。如需範例,請參閱建立可控制 Silverlight 應用程式中腳本的按鈕。Silverlight 2 應用程式中的使用者互動,可使用事件處理常式或狀態完成。如需詳細資訊,請參閱根據使用者互動變更狀態

在應用程式的生命週期內,使用者介面中的物件會經歷狀態的變更。狀態 (例如按鈕的滑鼠移過狀態,或是功能表項目的按下狀態) 通常是從使用者的角度來定義。這兩個範例狀態會分別使用 UIElement.IsMouseOver 屬性及 MenuItem.IsPressed 屬性來實作。

但使用者並不會察覺到這些屬性的值及所代表的狀態。IsMouseOver 及 IsPressed 都不是視覺屬性。若要顯示非視覺屬性的變更,就必須先觸發視覺屬性的變更 (例如 Background 或 Opacity)。例如,讓處於滑鼠移過狀態的按鈕,從原本的扁平狀變成凸起狀;或是在按下功能表項目時,變更背景色彩。

物件不僅會變更狀態,也會引發事件。例如,當指標越過按鈕邊界時,按鈕會引發 MouseEnter 及 MouseLeave 事件。事件本身也沒有外觀,因此必須觸發視覺屬性的變更,使用者才會察覺事件。

觸發程序 (及動畫時間軸) 可以建立在文件根元素或套用至控制項的樣式中。例如,您可以修改按鈕的樣式,讓按鈕在變更為按下及滑鼠指向狀態時有稍微不同的外觀。只要是套用相同樣式的按鈕,就會有相同的行為。如需範例,請參閱試試看:將動畫新增至按鈕

觸發程序有兩種:

  • 屬性觸發程序   一個屬性的變更觸發另一個屬性發生立即或動態變更時,所依據的機制。

  • 事件觸發程序   事件觸發屬性發生動態變更時,所依據的機制。

下圖顯示 [觸發程序] 使用者介面,其中有兩個屬性觸發程序 (IsMouseOverIsPressed) 以及一個事件觸發程序 (target-element.Loaded)。IsMouseOver 屬性觸發程序為選取狀態,顯示已變更的屬性 (Border.Background) 及觸發的時間軸 (OnLoaded1)。

Cc294856.796fe3b0-6e25-43eb-aed6-2ac834fe40e4(zh-tw,Expression.10).png

如需處理觸發程序的範例,請參閱新增或移除觸發程序建立簡單動畫

Cc294856.7e183f1f-37d8-4dcb-980c-19a5d61ca087(zh-tw,Expression.10).gif回到頁首

屬性觸發程序

屬性觸發程序會定義觸發程序「條件」以及針對滿足的條件所應該採取的動作。範例條件:「button1 的 IsMouseOver 屬性為 true」。範例動作:「將 button1 的 Foreground 屬性設為 Red,並啟動將按鈕放大的動畫 Expand」。

Foreground 設為 Red 就屬於一種稱為「屬性 Setter」的動作。只有在符合條件時,Setter 才會生效;當不再符合條件時,屬性會回復為先前的值。啟動稱為 Expand 的動畫就屬於一種「進入動作」;符合條件時就會發生此動作。當不再符合條件時,就會發生「結束動作」。只有動畫才能以進入或結束動作來控制。下圖顯示此範例屬性觸發程序的生命週期。

Cc294856.e82c8455-215e-49da-954f-f1bb73d84af2(zh-tw,Expression.10).png

請注意,Setter 有能力在整個生命週期內控制 Foreground 屬性。到了第 5 階段時,Foreground 會再次自動重設為 Black。不過,任何由進入動作所執行的屬性動畫都不會復原。到了第 5 階段時,按鈕仍然呈現放大狀態。解決方法就是設計一個將按鈕重新縮小的 Contract 動畫,然後在結束動作中執行這個新的動畫。

屬性觸發程序只能定義於樣式或範本,但就大部分的處理觸發程序來說,最好的作法是將它們放在範本中。

Cc294856.7e183f1f-37d8-4dcb-980c-19a5d61ca087(zh-tw,Expression.10).gif回到頁首

事件觸發程序

事件觸發程序會定義觸發程序條件以及針對滿足的條件所應該採取的動作。範例條件:「在 button1 上引發 MouseEnter 事件」。範例動作:「啟動將按鈕放大的動畫 Expand」。

此範例動作與稍早在屬性觸發程序範例中使用的進入動作相同。事件觸發程序與屬性觸發程序的生命週期不同。相反地,它只是執行動作來回應事件。所以,事件觸發程序沒有進入和結束動作;只有動作而已。

如果我們希望指標進入按鈕邊界時會放大按鈕,然後當指標離開邊界時又回到正常大小,則我們必須定義一對事件觸發程序及相配的縮放動畫。事件觸發程序可以在樣式、範本或 LayoutRoot 中定義。

Cc294856.7e183f1f-37d8-4dcb-980c-19a5d61ca087(zh-tw,Expression.10).gif回到頁首

屬性觸發程序或事件觸發程序?

一個屬性通常由一組對應的事件來反映,您可以決定設計一個屬性觸發程序或兩個事件觸發程序。例如,使用 IsMouseOver 屬性觸發程序或使用一對 MouseEnter 與 MouseLeave 事件觸發程序,都可以達到相同的效果。請儘可能使用屬性觸發程序,在必要時才使用事件觸發程序。例如,當您不在樣式或範本內時。必須使用事件觸發程序時,為了彌補 Setter 的不足,您可以建立一對動畫並將主要畫面格放在時間 0 上。

Cc294856.7e183f1f-37d8-4dcb-980c-19a5d61ca087(zh-tw,Expression.10).gif回到頁首

觸發程序或事件處理常式方法?

您可以使用事件處理常式來達成觸發程序的一切功能,還可以加入任何其他程式設計邏輯,例如在另一個元素設定屬性、載入新的文件、建立新的元素等等。這是因為事件處理常式方法是以 C# 或 Microsoft Visual Basic .NET 定義於文件的程式碼後置檔案。如需詳細資訊,請參閱事件處理概觀

如需您可使用觸發程序或使用事件處理常式方法來連接的事件清單,請參閱 WPF 事件快速參照

Cc294856.7e183f1f-37d8-4dcb-980c-19a5d61ca087(zh-tw,Expression.10).gif回到頁首

請參閱

概念

控制何時執行腳本