原創|其它|編輯:郝浩|2012-08-23 21:51:18.000|閱讀 345 次
概述:本篇文章是WPF 4.5新特征系列的一部分,我們將一起探秘WPF 4.5里“事件的標記擴展”。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
本篇文章是WPF 4.5新特征系列的一部分,我們將一起探秘WPF 4.5里“事件的標記擴展”。更多WPF4.5探秘系列文章 WPF控件
標記擴展是什么?用在什么場景?
正如 Rob 指出,對于在XAML 中的標記擴展可以提供值。在這種情況下,也會提供一個委托,WPF 框架本身并不定義要用于事件的標記擴展。
在我看來,這個特性將使用新的場景。事實上,對于某些人創建這樣的擴展場景是一種夢想,就是在空間上引發事件時觸發一個動作。除了記住哪個命名空間中添加和使用行為與觸發,開發人員只需要創建一個標記擴展,就像他將創建一個轉換器。當然有一個最主要的缺點:不支持混合。如果你也樣是一個Blend的粉絲,你就會繼續使用behavior/trigger,因為它只需要簡單拖拽即可。因此,很多人覺得它不會過時,這依舊是一個指的記住的好特性和選擇。
如何使用標記擴展?
這次,很明顯不能像WPF的其他特性一樣的使用。
作為一個標記擴展,一個類繼承了標記擴展,并實現抽象為ProvideValue方法。這就是所謂的框架,它提供了一個IServiceProvider的對象作為參數。
這serviceProvider是一個依賴解析器,你可以使用它來獲取一個命名IProvideValueTarget的服務,然后會被用來獲取屬性的MarkupExtension (你可以得到它的目標對象)的目標。
這個屬性是事件活動的訪問器(當你訂閱的時候會用“+ =”語法來調用它)。這時,反射會被用來找到目標事件的處理程序的類型。
一旦做到了這點,就會創建一個Delegate和由這個MarkupExtension所提供的返回值。在接下來的例子里面,delegate處理程序是一個被命名為“MyMarkupExtensionInternalHandler”的方法,定義在標記擴展本身里。
public override object ProvideValue(IServiceProvider serviceProvider)
{
IProvideValueTarget targetProvider = serviceProvider
.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;
if (targetProvider == null)
throw new InvalidOperationException(@"The CallAction extension
can't retrieved the IProvideValueTarget service.");
var targetEventAddMethod = targetProvider.TargetProperty as MethodInfo;
//Retrieve the handler of the event
ParameterInfo[] pars = targetEventAddMethod.GetParameters();
Type delegateType = pars[1].ParameterType;
//Retrieves the method info of the proxy handler
MethodInfo methodInfo = this.GetType()
.GetMethod("MyMarkupExtensionInternalHandler",
BindingFlags.NonPublic | BindingFlags.Instance);
//Create a delegate to the proxy handler on the markupExtension
Delegate returnedDelegate = Delegate
.CreateDelegate(delegateType, this, methodInfo);
return returnedDelegate;
}
void MyMarkupExtensionInternalHandler(object sender, EventArgs e)
{
//here something can be performed.
}
當你創建你的標記擴展的時候,必須知道的一些事:
1、 當有壞的事情發生了,拋掉 InvalidOperationException,
2、 不要認為所有的事情都已經初始化了:當然不是,特別是對于目標的數據文件。
3、 常常檢查你檢索的不為空的對象,特別是通過 IServiceProvider 參數而獲得的服務。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:外文翻譯