6

似乎ContentPresenter在我的中有一个ListBoxItem.ContentTemplate导致 Visual Studio 崩溃?

<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错了?基本上,我希望文本 hello, world 进入那些内容演示者

4

1 回答 1

8

在 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>
于 2010-11-10T15:29:52.097 回答