2012-06-23 62 views
19

是什麼區別:何時使用{x:Type ...}?

<Style TargetType="{x:Type Border}"> 

和:

<Style TargetType="Border"> 

何時以及爲什麼我需要使用{x:Type …}

+1

+1好問題。我的猜測是第二個是一個新的,改進的符號。 – McGarnagle

+3

類似的老問題 - - http://stackoverflow.com/questions/1085730/difference-between-targettype-controltype-and-targettype-xtype-controltype/9128422#9128422和 http://stackoverflow.com/questions/ 5449481/performance-diff-between-target-sometype-and-target-xtype-sometype/9127377#9127377 – akjoshi

回答

11

效果沒有區別;在這兩種情況下的TargetType屬性將被設置爲typeof(Border)

第一個版本{x:Type Border}需要在WPF的第一個版本,因爲編譯器沒有使用TypeConverter類的字符串轉換成一個類型的對象,你需要指定TypeExtension班級爲你做。

如果我沒有記錯的話,第二個版本是用Silverlight引入的,並很快找到了WPF編譯器。

編輯

我在TypeConverter類的假設是錯誤的;這是由FrameworkElementFactory實施:

the documentation:支持類型名-作爲字符串

WPF支持,使指定的類型類型的一些 屬性值的技術

類型屬性無需使用x:Type標記擴展 。相反,您可以將該值指定爲名稱爲 類型的字符串。這個例子是ControlTemplate.TargetType和Style.TargetType。不支持通過 類型轉換器或標記擴展提供此行爲的支持。相反,這是通過FrameworkElementFactory實現的 延期行爲。

Silverlight支持類似的約定。事實上,Silverlight目前在其XAML語言支持中目前不支持{x:Type}, 在幾種情況之外不支持{x:Type}用法,其中 旨在支持WPF-Silverlight XAML遷移。因此, typename-as-string行爲內置於所有Silverlight本機 屬性評估,其中Type是值。

1

兩者完全相同。在任何一種情況下,你的風格只適用於Border

2

將此屬性(TargetType)設置爲邊框而不指定帶有x:Key的樣式允許將樣式應用於所有邊框元素。 但是,當您將x:Key設置爲{x:Type Border}時,這意味着如果您將Style的值設爲x:Key而不是{x:Type Border},則Style將不會自動應用於所有邊界元素。相反,您需要將樣式明確應用於Border元素。

4

雖然在給定的例子中,它沒有什麼區別,但實際上x:TypeTypeName-as-String之間存在差異。

我最近遇到的情況這表明x:TypeTypeName-as-String不同,當涉及到自定義類型。從我的經驗 -

x:Type認爲強名稱或程序集的版本(其中型居住),但不TypeName-as-String

我在這裏我的博客中解釋了我的情況和其他細節 -

Importance of specifying AncestorType with x:Type in RelativeSourceBinding

從這個

除此之外,也有在WPF如何推斷類型差異。對於x:Type使用TypeExtension,而使用TypeName-as-String使用FrameworkElementFactory(如Erno提到的)。

0

如果您使用的是XAML 2009,則可以將x:Key指定爲元素,以顯式支持字符串以外的對象類型所鍵入的字典,而不需要標記擴展名中間值。請參閱本主題中的「XAML 2009」部分。備註部分的其餘部分特別適用於XAML 2006實現。

x:Key的屬性值可以是XamlName語法中定義的任何字符串,也可以是通過標記擴展名評估的對象。有關WPF示例的信息,請參閱「WPF使用說明」。

作爲IDictionary實現的父元素的子元素通常必須包含一個x:Key屬性,該屬性指定該字典中的唯一鍵值。框架可能實現別名關鍵屬性以替代特定類型的x:Key;定義這些屬性的類型應該用DictionaryKeyPropertyAttribute進行歸屬。

指定x:Key的代碼等價物是用於底層IDictionary的鍵。例如,在WPF中爲資源應用標記的x:Key與在代碼中將資源添加到WPF ResourceDictionary時等同於ResourceDictionary.Add的關鍵參數的值。 x:Type標記擴展具有與C#中的typeof()運算符或Microsoft Visual Basic中的GetType運算符類似的功能。

x:Type標記擴展爲採用類型Type的屬性提供字符串轉換行爲。輸入是一個XAML類型。輸入XAML類型和輸出CLR類型之間的關係是在根據XAML模式上下文和上下文提供的IXamlTypeResolver服務查找必要的XamlType之後,輸出Type是輸入XamlType的UnderlyingType。

在.NET Framework XAML Services中,此標記擴展的處理由TypeExtension類定義。

在特定的框架實現中,一些將Type作爲值的屬性可以直接接受類型的名稱(Name類型的字符串值)。但是,實施這種行爲是一個複雜的情況。有關示例,請參閱下面的「WPF使用說明」一節。

屬性語法是此標記擴展中使用的最常用語法。在x:Type標識符字符串之後提供的字符串標記被分配爲基礎TypeExtension擴展類的TypeName值。在基於CLR類型的.NET Framework XAML服務的默認XAML架構環境下,此屬性的值是所需類型的名稱,或者包含名稱前面有非默認XAML名稱空間映射的前綴。

x:Type標記擴展可用於對象元素語法中。在這種情況下,需要指定TypeName屬性的值才能正確初始化擴展。

x:Type標記擴展也可以用作詳細屬性;然而這種使用並不典型:

+4

如果你複製一個測試,你應該給一個鏈接和/或給予功勞。 –

+0

Ctrl + C,Ctrl + V檢測到:) –