2010-11-10 13 views
6

Sembra che avere un ContentPresenter nel mio ListBoxItem.ContentTemplate stia causando l'arresto anomalo di Visual Studio?C'è qualche problema con avere un ContentPresenter in ListBoxItem.ContentTemplate?

<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> 

O forse sto usando ContentPresenter sbagliato? Fondamentalmente, voglio il testo ciao, il mondo per andare in quei content presenters

+1

provato il codice e si schiantò bene :) –

+2

Non è possibile utilizzare ContentPresenter in ContentTemplate perché è una specie di codice ricorsivo, ContentPresenter sarà ancora una volta caricare ContentTemplate, e ContentTemplate sarà ancora una volta caricare ContentPresenter e così via .. .. –

risposta

8

Il ItemTemplate di un ListBox viene copiato nel ContentTemplate di un oggetto ListBox durante la generazione dell'interfaccia utente. Significa che il tuo codice è equivalente al seguente.

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

Tuttavia, stai aggiungendo direttamente ListBoxItems, quindi non è vero al 100%.
(ItemTemplate e ItemTemplateSelector vengono ignorati per gli elementi già del tipo a contenitori del ItemsControl; Tipo = 'ListBoxItem')

Per approfondire sul perché Studio si blocca visivi. In primo luogo, si blocca solo una volta che viene compilato il ListBox, quindi questo accadrà solo quando si aggiunge ListBoxItem direttamente in Xaml (la tua app andrà in crash ma non VS). ContentPresenter è il luogo in cui il Template per ListBox sta inserendo il ContentTemplate. Quindi, se abbiamo questa

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

e non cambiamo il modello in modo che appaia qualcosa di simile (versione shortend)

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

Avremo

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

e così via . Non si ferma mai e Visual Studio si arresta in modo anomalo. Se cambiamo il modello in questo

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

non otteniamo alcun arresto poiché ContentPresenter non viene mai utilizzato.
(Penso di aver bloccato Studio una dozzina di volte mentre sto provando questo :)

Quindi nel tuo caso, dovresti usare Template invece di 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> 
Problemi correlati