Die ItemTemplate einer ListBox wird in die ContentTemplate eines ListBoxItem während UI-Generierung kopiert. Das bedeutet, dass Ihr Code dem folgenden entspricht.
<ListBox>
<ListBox.ItemTemplate>
<DataTemplate>
<DockPanel>
<TextBlock><ContentPresenter /></TextBlock>
</DockPanel>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBoxItem Content="Hello" />
<ListBoxItem Content="World" />
</ListBox>
Sie fügen jedoch die ListBoxItems direkt hinzu, damit dies nicht zu 100% zutrifft.
(ItemTemplate und ItemTemplateSelector werden für Items ignoriert, die bereits vom ItemsControl-Containertyp stammen; Type = 'ListBoxItem')
Um zu erläutern, warum Visual Studio abstürzt. Erstens stürzt es nur ab, wenn die ListBox gefüllt wird, dies geschieht nur, wenn Sie ListBoxItems direkt in Xaml hinzufügen (Ihre App wird immer noch abstürzen, aber nicht VS). Der ContentPresenter ist der Ort, an dem die Vorlage für die ListBox die ContentTemplate einfügt. Also, wenn wir diese haben
<Style TargetType="ListBoxItem">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock><ContentPresenter /></TextBlock>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
und wir ändern nicht die Vorlage, so dass es so etwas wie dieses (gekürzte Fassung) sieht
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<ContentPresenter/>
</ControlTemplate>
</Setter.Value>
</Setter>
Wir bekommen
<ContentPresenter/> -> <TextBlock><ContentPresenter /></TextBlock> ->
<TextBlock><TextBlock><ContentPresenter /></TextBlock></TextBlock>
und so weiter . Es hört nie auf und Visual Studio stürzt ab. Wenn wir die Vorlage in diese
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<TextBlock Text="No ContentPresenter Here"/>
</ControlTemplate>
</Setter.Value>
</Setter>
ändern, erhalten wir keinen Absturz, da der ContentPresenter nie verwendet wird.
(Denken Sie, ich stürzte Studio ein Dutzend Mal beim Ausprobieren :)
Also in Ihrem Fall sollten Sie Template anstelle von ContentTemplate verwenden.
<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>
Ihr Code versucht, und es stürzte in Ordnung :) –
Sie können nicht Content in Content verwenden, weil es Art von rekursiven Code ist, wird Content erneut Content laden und Content erneut Content laden und so weiter .. .. –