2009-07-31 35 views
3

XAML Parser如何將Foreground =「Red」中的字符串「Red」轉換爲SolidColorBrush? Allthough我知道類型有System.ComponentModel.TypeConverter定義,我相信WPF XAML解析器會總是使用這些將字符串轉換爲畫筆。除XamlReader.Load外(還有一個有效的xml字符串),是否有任何XAML API可用於解析單個字符串,就好像它在某個屬性的attibute中一樣?手動將字符串解析爲XAML屬性

回答

-1

我相信你可以充分利用這一點。 XamlReader知道目標類型(該字符串必須應用到的屬性的類型)。您將爲該屬性的類型註冊一個TypeConverter。

編輯這會爲你工作,當談到SolidColorBrush

var colorString = ...; 
var converter = new System.Windows.Media.BrushConverter(); 
var brush = (SolidColorBrush)converter.ConvertFromString(colorString); 

綜觀.net反射SolidColorBrush,似乎確實內XamlReader反序列化的魔力大約使用已知類型的內部API。我不確定你是否可以註冊自己的類型來處理這個問題。

+0

是的,這是我現在這樣做的。但我注意到XamlReader並不總是使用TypeConverters來解析字符串。所以XamlReader必須有更多的邏輯來解析這些類型轉換器。我的問題是這暴露在某處的API? – bitbonk 2009-08-03 08:58:51

0

XAML解析器(對於WPF)實際上確實使用指定的屬性或屬性類型的類型轉換器。有幾個硬編碼的快捷方式,但它們是爲了性能而不改變語義。一個解析器,只是使用屬性信息,可以複製解析器語義(例如,Blend和Cider所做的)。

沒有任何API會像XAML那樣完全轉換值,主要是因爲許多類型轉換隻能在XAML解析的上下文中工作。例如,類型轉換器可以引用XAML文件中定義的名稱空間(根據XML文件中值的位置而定),以及該文件的其他環境信息庫URI基礎。這些只有在解析XAML文件時才適用。

你能來是要求的屬性描述符從類型描述符的屬性和使用轉換器性能最接近的一次。這將掃描適當的屬性以創建正確的類型轉換器。