2009-12-09 47 views
0

alt text http://akashkava.com/blog/wp-content/uploads/2009/12/ListBoxItem-Selection-Problem.png列表框前景色爲問題選定的項目沒有ItemContainer

下面的代碼,行爲有些奇怪。

<ListBox SelectionMode="Multiple"> 

     <StackPanel> 
      <TextBlock>Selection is Black</TextBlock> 
     </StackPanel> 

     <ListBoxItem> 
      <StackPanel> 
       <TextBlock>Selection is White</TextBlock> 
      </StackPanel> 
     </ListBoxItem> 
</ListBox> 

注意,第一個選擇停留在黑色,那是因爲項目不是自己的ItemContainer,但是在第二種情況項目是它自己的ItemContainer所以風格正常工作。大多數時候我們通過模板填充數據,每次我們的Item不是它自己的ItemContainer,這就是爲什麼TextBlock在前景色方面表現奇怪。

重要提示:我在尋找「爲什麼發生這種情況」的答案,而不是如何解決它,我知道解決方法TextElement.Foreground =「{TemplateBinding Foreground}」,但我想知道爲什麼發生這種情況。

回答

2

我想,那是因爲邏輯樹是不同的位置:

alt logical tree http://img13.imageshack.us/img13/9082/logicaltree.jpg

當你明確指定一個ListBoxItem你將它添加到邏輯樹,前景繼承它。在StackPanel的情況下,邏輯樹是不同的,Foreground是從不同的父類繼承的...我相信你以前已經閱讀過,但只是爲了日誌。 Mike Hillberg的文章非常棒:Of logical and visual trees in WPF。他非常清楚地解釋了這種行爲。

乾杯

+0

感謝您的答案,你能告訴我在哪裏以及如何看到這個邏輯樹?你用哪個工具找出這個問題?但我懷疑這是這種情況,因爲「樣式」和模板應該適用於正確的可視化樹。 – 2009-12-09 19:32:50

+0

該工具是鼴鼠:http://karlshifflett.wordpress.com/mole-for-visual-studio/ – Anvaka 2009-12-09 20:57:06

+0

感謝您的回答,我詳細閱讀,DP實際上遵循邏輯父母,然後視覺..這當然是一個問題在項目控制的情況下,我向微軟報告,但他們只會說「由設計解決」,但它只是意味着我必須重寫很多庫代碼才能完成這項工作。 – 2009-12-11 07:59:28