2014-10-16 50 views
1

如果有多個樣式是這樣的:對同一目標類型多款式

<Style TargetType="{x:Type local:MyControl}"> 
... 

,從這個目標相同類型的控制,它應該有優先資源字典合併的,是它遇到的第一個風格還是最後一個?

我在哪裏可以找到管理這些事情的規則?

+2

您不能將它們合併到一個字典中,因爲它們具有相同的密鑰。 – 2014-10-16 21:03:33

+0

@Hamlet即使我不x:命名樣式? – Chanakya 2014-10-16 21:24:46

+1

@Chanakya:ResourceDictionaries中的元素有鍵,而不是名稱。閱讀下面的答案,它解釋了爲什麼這是不可能的。 (有一個隱式鍵)。如果你仔細想想,.NET如何知道使用哪種風格?想象一下,除了紅色和藍色以外,它們是完全相同的。 – 2014-10-17 06:29:48

回答

4

樣式是從最接近相關控件的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

+0

Thankyou,這回答了我關於規則的原始觀點,雖然我不能接受這兩個答案,但是Hamlet的答案確實有助於理解何時在相同的資源字典中以及關於密鑰的觀點。 – Chanakya 2014-10-17 13:18:14

+0

語法結束。我沒有意識到你可以使用BasedOn而不用引用Style。很有用。 – AndrewS 2016-04-16 08:14:20

2

這是你的評論和問題的答案。在這種情況下,Name, x:Name不在場景中播放。字典中的每個資源都必須有Key。對於有針對性的樣式,WPF基礎結構會生成Key,因此,具有相同目標類型的樣式將具有相同的鍵,因此對於字典中的每種類型都不能使用多個目標樣式。

0

它會拋出異常。這是我想測試:

我寫了一個簡單的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> 

重建項目,並順利編譯。現在哪個會被應用?

那麼,當我運行它時,加載樣式時會引發一個大的異常。總之,它不起作用。

相關問題