2010-11-10 11 views
6

ऐसा लगता है कि में ContentPresenter होने पर ऐसा लगता है कि विजुअल स्टूडियो क्रैश हो रहा है?क्या ListBoxItem.ContentTemplate में ContentPresenter होने में कोई समस्या है?

<ListBox> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="ContentTemplate"> 
       <Setter.Value> 
        <DataTemplate> 
         <DockPanel> 
          <TextBlock><ContentPresenter /></TextBlock> 
         </DockPanel> 
        </DataTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </ListBox.ItemContainerStyle> 
    <ListBoxItem Content="Hello" /> 
    <ListBoxItem Content="World" /> 
</ListBox> 

या शायद मैं ContentPresenter गलत उपयोग कर रहा हूं? असल में, मुझे पाठ सामग्री हैलो, उन सामग्री प्रस्तुतियों में जाने के लिए दुनिया

+1

अपने कोड की कोशिश की और यह ठीक दुर्घटनाग्रस्त हो :) –

+2

आप ContentTemplate में ContentPresenter उपयोग कर सकते हैं नहीं है क्योंकि यह पुनरावर्ती कोड की तरह है, ContentPresenter एक बार फिर से ContentTemplate लोड होगा, और एक बार फिर से ContentTemplate ContentPresenter लोड और इतने पर होगा .. .. –

उत्तर

8

एक सूची बॉक्स का आइटम टेम्पलेट यूआई पीढ़ी के दौरान ListBoxItem की ContentTemplate पर कॉपी किया गया है। मतलब है कि आपका कोड निम्न के बराबर है।

<ListBox> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <DockPanel> 
       <TextBlock><ContentPresenter /></TextBlock> 
      </DockPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
    <ListBoxItem Content="Hello" /> 
    <ListBoxItem Content="World" /> 
</ListBox> 

हालांकि, आप सीधे ListBoxItems जोड़ रहे हैं, इसलिए यह 100% सत्य नहीं है।
(ItemTemplate और ItemTemplateSelector ItemsControl के कंटेनर प्रकार के पहले से ही मदों के लिए ध्यान नहीं दिया जाता, प्रकार = 'ListBoxItem')

क्यों दृश्य स्टूडियो के क्रैश की विस्तार से बता दें। सबसे पहले, सूचीबॉक्स पॉप्युलेट होने के बाद ही यह केवल दुर्घटनाग्रस्त हो जाता है, इसलिए यह केवल तब ही खुश होगा जब ListBoxItem को सीधे Xaml में जोड़ना होगा (आपका ऐप अभी भी क्रैश होगा लेकिन वीएस नहीं होगा)। ContentPresenter वह स्थान है जहां ListBox के लिए टेम्पलेट ContentTemplate डालने जा रहा है। तो अगर हम इस

<Style TargetType="ListBoxItem">   
    <Setter Property="ContentTemplate">   
     <Setter.Value>   
      <DataTemplate>   
       <TextBlock><ContentPresenter /></TextBlock> 
      </DataTemplate>   
     </Setter.Value>   
    </Setter>   
</Style> 

है और हम टेम्पलेट में परिवर्तन नहीं करते तो यह इस (shortend संस्करण) तरह दिखता है

<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="ListBoxItem"> 
      <ContentPresenter/> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 

हम मिल जाएगा

<ContentPresenter/> -> <TextBlock><ContentPresenter /></TextBlock> -> 
<TextBlock><TextBlock><ContentPresenter /></TextBlock></TextBlock> 

और इतने पर । यह कभी नहीं रुकता है, और विजुअल स्टूडियो दुर्घटनाग्रस्त हो जाता है। यदि हम इस

<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="ListBoxItem"> 
      <TextBlock Text="No ContentPresenter Here"/> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 

पर टेम्पलेट को बदलते हैं तो सामग्री प्रस्तुति का कभी भी उपयोग नहीं होने के बाद हमें कोई क्रैश नहीं मिलता है।
(सोचें कि मैंने इसे आजमाते हुए स्टूडियो को एक दर्जन बार दुर्घटनाग्रस्त कर दिया :)

तो आपके मामले में, आपको ContentTemplate के बजाय टेम्पलेट का उपयोग करना चाहिए।

<ListBox> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
         <DockPanel> 
          <TextBlock><ContentPresenter /></TextBlock> 
         </DockPanel> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </ListBox.ItemContainerStyle> 
    <ListBoxItem Content="Hello" /> 
    <ListBoxItem Content="World" /> 
</ListBox> 
संबंधित मुद्दे