Le ItemTemplate d'un ListBox est copié dans le ContentTemplate d'un ListBoxItem lors de la génération de l'interface utilisateur. Cela signifie que votre code est équivalent à ce qui suit. Cependant, vous ajoutez directement les ListBoxItems de sorte que ce n'est pas 100% vrai.
(ItemTemplate et ItemTemplateSelector sont ignorés pour les éléments déjà du type de conteneur de ItemsControl, type = 'ListBoxItem')
Pour expliquer pourquoi Visual Studio se bloque. Tout d'abord, il ne se bloque que lorsque le ListBox est rempli, ce qui ne se produira que lors de l'ajout direct de ListBoxItem dans Xaml (Votre application va toujours planter mais pas VS). Le ContentPresenter est l'endroit où le Template pour le ListBox insère le ContentTemplate. Donc, si nous avons cette
<Style TargetType="ListBoxItem">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock><ContentPresenter /></TextBlock>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
et nous ne changeons pas le modèle de sorte qu'il ressemble à ceci (version raccourci dans)
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<ContentPresenter/>
</ControlTemplate>
</Setter.Value>
</Setter>
Nous aurons
<ContentPresenter/> -> <TextBlock><ContentPresenter /></TextBlock> ->
<TextBlock><TextBlock><ContentPresenter /></TextBlock></TextBlock>
et ainsi de suite . Il ne s'arrête jamais et Visual Studio se bloque. Si nous changeons le modèle à ceci
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<TextBlock Text="No ContentPresenter Here"/>
</ControlTemplate>
</Setter.Value>
</Setter>
nous n'obtenons pas de plantage puisque le ContentPresenter n'est jamais utilisé.
(Pensez que j'ai crashé Studio une douzaine de fois en essayant cela :)
Donc dans votre cas, vous devriez utiliser Template au lieu de 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>
Essayé votre code et il va bien :) écrasements –
Vous ne pouvez pas utiliser ContentPresenter en ContentTemplate parce qu'il est genre de code récursif, ContentPresenter sera de nouveau charger ContentTemplate et ContentTemplate sera une fois charger à nouveau ContentPresenter et ainsi de suite .. .. –