如果有多個樣式是這樣的:對同一目標類型多款式
<Style TargetType="{x:Type local:MyControl}">
...
,從這個目標相同類型的控制,它應該有優先資源字典合併的,是它遇到的第一個風格還是最後一個?
我在哪裏可以找到管理這些事情的規則?
如果有多個樣式是這樣的:對同一目標類型多款式
<Style TargetType="{x:Type local:MyControl}">
...
,從這個目標相同類型的控制,它應該有優先資源字典合併的,是它遇到的第一個風格還是最後一個?
我在哪裏可以找到管理這些事情的規則?
樣式是從最接近相關控件的ResourceDictionary應用的。例如:
<Window>
<Window.Resource>
<Style 1/>
<Window.Resources>
<Grid>
<Grid.Resources>
<Style 2/>
</Grid.Resources>
<TextBox/>
</Grid>
</Window>
在上例中,樣式2將應用於文本框。如果您希望級聯樣式(將兩種樣式應用於文本框),則可以使用BasedOn="{StaticResource {x:Type TextBox}}"
將樣式2上的BasedOn
設置爲指向樣式1。請檢查語法,我沒有在這裏VS。
如您所見,類型變爲Key
。由於不允許在一個ResourceDictionary
中使用具有相同密鑰的兩個元素,因此無法合併兩個具有重疊樣式的ResourceDictionaries。應該可以圍繞這樣的需求進行設計,記住ResourceDictionary可以引用其他用途。再次,您使用BasedOn
。
這是你的評論和問題的答案。在這種情況下,Name, x:Name
不在場景中播放。字典中的每個資源都必須有Key
。對於有針對性的樣式,WPF基礎結構會生成Key
,因此,具有相同目標類型的樣式將具有相同的鍵,因此對於字典中的每種類型都不能使用多個目標樣式。
它會拋出異常。這是我想測試:
我寫了一個簡單的ResourceDictionary
有2款,同TargetType
但沒有x:Key
(不x:Name
)。
<Style TargetType="TextBox">
<Setter Property="Height" Value="100"/>
</Style>
<Style TargetType="TextBox">
<Setter Property="Height" Value="200"/>
</Style>
重建項目,並順利編譯。現在哪個會被應用?
那麼,當我運行它時,加載樣式時會引發一個大的異常。總之,它不起作用。
您不能將它們合併到一個字典中,因爲它們具有相同的密鑰。 – 2014-10-16 21:03:33
@Hamlet即使我不x:命名樣式? – Chanakya 2014-10-16 21:24:46
@Chanakya:ResourceDictionaries中的元素有鍵,而不是名稱。閱讀下面的答案,它解釋了爲什麼這是不可能的。 (有一個隱式鍵)。如果你仔細想想,.NET如何知道使用哪種風格?想象一下,除了紅色和藍色以外,它們是完全相同的。 – 2014-10-17 06:29:48