WPF-11 路由事件之一

什么是路由事件?

我們從兩個維度來理解路由事件:

功能的角度來看,路由事件是一種事件類型,不僅僅可以在事件源上處理事件響應,還可以在元素樹的多個偵聽器上處理事件響應(事件偵聽器是附加和調用事件處理程序的元素。事件源是最初引發事件的元素或對象)

實現的角度來看,路由事件是使用 CLR 事件“包裝器”實現的,由 RoutedEvent 類的實例支持,并由 WPF 事件系統處理。

根據路由事件的定義方式,當事件在源元素上引發時:

  1. 從源元素到根元素(通常是頁面或窗口)通過元素樹冒泡

  2. 從根元素到源元素通過元素樹向下隧道

  3. 不遍歷元素樹,只出現在源元素上

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

示例中的這三個Button都有自己Click事件,當觸發一個button的Click事件時,Button元素的Click事件沿著樹傳播到根節點,Button和Border沒有響應時間處理程序,但是StackPanel會響應。在這個例子中事件傳播:Button -> StackPanel -> Border -> 父元素

如何實現路由事件?

我們可以通過WPF框架提供的接口來注冊路由事件,由 RoutedEvent 類的實例支持。從注冊中獲得的 RoutedEvent 實例通常存儲為注冊它的類的公共靜態只讀成員。該類稱為事件“所有者”類。通常,路由事件是對同名 CLR 事件的“包裝器”。CLR 事件包裝器包含添加和刪除訪問器,以便通過特定于語言的事件語法在 XAML 和代碼隱藏中附加處理程序。add 和 remove 訪問器覆蓋其 CLR 實現并調用路由事件 AddHandler 和 RemoveHandler 方法。路由事件機制類似于依賴屬性的機制。

以下示例注冊 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); }
}

路由策略

路由事件使用以下三種路由策略之一:

冒泡:最初,事件源上的事件處理程序被調用。路由事件然后路由到連續的父元素,依次調用它們的事件處理程序,直到它到達元素樹根。大多數路由事件使用冒泡路由策略。冒泡路由事件通常用于報告來自復合控件或其他 UI 元素的輸入或狀態更改。

隧道:最初,調用元素樹根處的事件處理程序。路由事件然后路由到連續的子元素,依次調用它們的事件處理程序,直到它到達事件源。遵循隧道路由的事件也稱為預覽事件。WPF 輸入事件通常實現為預覽和冒泡對。

直接:僅調用事件源上的事件處理程序。這種非路由策略類似于標準 CLR 事件的 Windows 窗體 UI 框架事件。與 CLR 事件不同,直接路由事件支持類處理并且可由 EventSetters 和 EventTriggers 使用。

為什么用路由事件

軟件開發人員并需要知道你正在處理的事件是路由事件,路由事件本身具有自己的特性,如果你正在處理元素自身引發的事件,則該行為是不可用的。但是,如果你將事件附加到父元素或者子元素 ,這時路由事件就體現了它自己的特性。

路由事件支持沿事件路由的元素之間的事件信息交換,因為每個偵聽器都可以訪問相同的事件數據實例。如果一個元素更改了事件數據中的某些內容,則該更改對事件路由中的后續元素可見。?WPF 樣式和模板功能(例如 EventSetters 和 EventTriggers)要求引用的事件是路由事件。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281679.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281679.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281679.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

個人總結的一個中高級Java開發工程師或架構師需要掌握的一些技能...

近三年&#xff0c;其實都是在做一個項目&#xff0c;項目是一個大型的多節點部署的項目&#xff0c;做了好幾個版本&#xff0c;中間用到了很多技術和框架&#xff0c; 也用了一些管理工具和敏捷實踐。我這里不是來說項目的&#xff0c;因為最近看了一些招聘信息&#xff0c;結…

Android 進程常駐(5)----開機廣播的簡單守護以及總結

這是一個輕量級的庫&#xff0c;配置幾行代碼。就能夠實如今android上實現進程常駐&#xff0c;也就是在系統強殺下&#xff0c;以及360獲取root權限下。clean master獲取root權限下都無法殺死進程 支持系統2.3到6.0 支持大部分設備&#xff0c;包含三星。華為。oppo&#xff0…

[k8s]metricbeat的kubernetes模塊kube-metric模塊

正確姿勢啟動metricbeat metricbeat.modules: - module: systemmetricsets:- cpu- filesystem- memory- network- processenabled: trueperiod: 10sprocesses: [.*]cpu_ticks: falseoutput.elasticsearch:hosts: ["http://192.168.x.x:9200"]setup.template.name: &q…

如何為 Task 添加超時功能

前言假設有如下代碼&#xff0c;功能是首先從緩存獲取數據&#xff0c;如果沒有命中緩存&#xff0c;則直接從數據庫獲取&#xff1a;var data await GetFromCache(); if (data is null) {data await GetFromDB(); }對于獲取緩存數據&#xff0c;我們需要限制一下GetFromCach…

php 隨機指定位數,php生成一個可選位數的隨機碼

echo coding(6);function coding($num){$str_arr array(‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘f‘,‘g‘,‘h‘,‘i‘,‘j‘,‘k‘,‘l‘,‘m‘,‘n‘,‘o‘,‘p‘,‘q‘,‘r‘,‘s‘,‘t‘,‘u‘,‘v‘,‘w‘,‘x‘,‘y‘,‘z‘,‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘,‘G‘,‘H‘…

Animate與transform的使用

Animate是用css給前端加載動畫的效果&#xff1a; 網址&#xff1a;https://daneden.github.io/animate.css/ <!DOCTYPE html> <html lang"en"> <head><link rel"stylesheet" href"static/css/Animate.css"><meta ch…

angular中的cookies與cookieStore區別

設置cookie用put()方法: $cookies.put(key, value[, options]); $cookieStore.put(key, value); 例如設置一個cookie&#xff0c;名為“userName”&#xff0c;值為“yangmin”&#xff1a; //使用$cookies設置cookie $cookies.put(userName, yangmin); //使用$cookieStore設置…

ASP.NET Core 6框架揭秘實例演示[29]:搭建文件服務器

通過HTTP請求獲取的Web資源很多都來源于存儲在服務器磁盤上的靜態文件。對于ASP.NET應用來說&#xff0c;如果將靜態文件存儲到約定的目錄下&#xff0c;絕大部分文件類型都是可以通過Web的形式對外發布的。“Microsoft.AspNetCore.StaticFiles” 這個NuGet包中提供了三個用來處…

js 棧(進制轉換)

<!DOCTYPE html>Documentposted 2017-12-07 19:33 mysure 閱讀(...) 評論(...) 編輯 收藏 刷新評論刷新頁面返回頂部轉載于:https://www.cnblogs.com/ar13/p/8000718.html

流程展示 php,js實現動態的流程進度展示條

這次給大家帶來js實現動態的流程進度展示條&#xff0c;js實現動態流程進度展示條的注意事項有哪些&#xff0c;下面就是實戰案例&#xff0c;一起來看一下。一、設計思路分為以下幾步(僅供參考)【豎線線】這個采用ul的list標簽制作&#xff0c;保證了可隨時添加&#xff0c;以…

【我們一起寫框架】C#的AOP框架

原文:【我們一起寫框架】C#的AOP框架前言 AOP&#xff0c;大家都是聽過的&#xff0c;它是一種面向切面的設計模式。 不過AOP雖然是被稱為設計模式&#xff0c;但我們應該很少能看到AOP設計的框架。為什么呢&#xff1f; 因為&#xff0c;AOP單獨設計的框架幾乎是無法使用的。普…

新浪微博授權認證過程

為什么80%的碼農都做不了架構師&#xff1f;>>> 一、授權認證 1、請求用戶授權Token URL&#xff1a; https://api.weibo.com/oauth2/authorize HTTP請求方式:GET/POST 請求參數 必選 類型及范圍 說明 client_id true string 申請應用時分配的AppKey。 redire…

VisualStudio 使用 FastTunnel 輔助搭建遠程調試環境

有時候需要遠程調試一些用戶問題&#xff0c;期望能使用本機的 Visual Studio 開發環境&#xff0c;調試遠程的用戶的設備上的應用。這時會遇到的一個問題是如何讓本機的 Visual Studio 可以連接上遠程的用戶的設備&#xff0c;從而進行調試。本文將告訴大家如何采用 FastTunne…

深入理解null的原理

--null的原理 --oracle一直將null和空字符串’’<長度為0>同等對待<如’’ is null是true,’’null為false,如果聲明a varchar2:’’,那么a is null為true,a’’為false>--1.null的運算 --算術表達式和null 運算總為null,實際上所有的操作符除了||連接操作符外&…

阻止中文輸入法輸入拼音的時候觸發input事件

阻止中文輸入法輸入拼音的時候觸發input事件 前言 最近看element-ui源碼的時候看到el-input發現的。這個少見的事件。 compositionstart、compositionend事件&#xff08;MDN解釋) compositionstart事件觸發于一段文字的輸入之前&#xff08;類似于 keydown 事件&#xff0c;但…

Python1

python介紹python是一種解釋型的&#xff0c;面對對象的。帶有動態語義的高級程序設計語言python簡史1989年,Guido(龜叔)為ABC 語言寫的一個插件。因Monty Python的喜劇團體的原因,故給這個語言起名為python。linux也是1989年誕生的,1991年正式發布linux1.0內核;1990年, 發布py…

ncut算法matlab實現,ncut_multiscale_1_6 經典的圖像分割算法 的Matlab代碼。 238萬源代碼下載- www.pudn.com...

文件名稱: ncut_multiscale_1_6下載收藏√ [5 4 3 2 1 ]開發工具: matlab文件大小: 587 KB上傳時間: 2015-04-17下載次數: 4提 供 者: HH詳細說明&#xff1a;經典的圖像分割算法NCut的Matlab代碼。-Matlab code of classic image segmentation algorithm NCut .文件列表(…

使用.NET從零實現基于用戶角色的訪問權限控制

使用.NET從零實現基于用戶角色的訪問權限控制本文將介紹如何實現一個基于.NET RBAC 權限管理系統&#xff0c;如果您不想了解原理&#xff0c;可查看推送的另一篇文章關于Sang.AspNetCore.RoleBasedAuthorization[1] 庫是使用介紹&#xff0c;直接使用該庫即可。背景在設計系統…

數據歸一化

數據歸一化 數據的標準化是將數據按比例縮放&#xff0c;使之落入一個小的特定區間&#xff0c;一般為0到1之間。在某些比較和評價的指標處理中經常會用到&#xff0c;去除數據的單位限制&#xff0c;將其轉化為無量綱的純數值&#xff0c;便于不同單位或量級的指標能夠進行比較…

vi is failed with error E382: Cannot write, 'buftype' option is set in Linux

在linux下生成jar文件遇到了編碼問題&#xff0c;于是想vi t.jar&#xff0c;在保存是報錯&#xff1a;E382: Cannot write, buftype option is set 解決方法&#xff1a; 可以用下面的命名查看buftype的設置&#xff0c;當buftypenofile時&#xff0c;不能保存文件&#xff0c…