在 UI 生成期间,ListBox 的 ItemTemplate 被复制到 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 的容器类型的项目被忽略;Type='ListBoxItem')
详细说明 Visual Studio 崩溃的原因。首先,它只会在填充 ListBox 时崩溃,因此只有在直接在 Xaml 中添加 ListBoxItem 时才会发生这种情况(您的应用程序仍会崩溃,但不会崩溃)。ContentPresenter 是 ListBox 的模板插入 ContentTemplate 的地方。所以如果我们有这个
<Style TargetType="ListBoxItem">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock><ContentPresenter /></TextBlock>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
而且我们没有更改模板,所以它看起来像这样(缩写版本)
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<ContentPresenter/>
</ControlTemplate>
</Setter.Value>
</Setter>
我们将得到
<ContentPresenter/> -> <TextBlock><ContentPresenter /></TextBlock> ->
<TextBlock><TextBlock><ContentPresenter /></TextBlock></TextBlock>
等等。它永远不会停止,Visual Studio 会崩溃。如果我们将模板更改为此
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<TextBlock Text="No ContentPresenter Here"/>
</ControlTemplate>
</Setter.Value>
</Setter>
我们没有崩溃,因为从未使用过 ContentPresenter。
(想想我在尝试这个时让 Studio 崩溃了十几次 :)
因此,在您的情况下,您应该使用模板而不是 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>