1

请注意以下标记:

<Style TargetType="{x:Type MenuItem}" x:Key="...">
    <Setter Property="HeaderTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <ContentPresenter />
                    </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

将此样式添加到应用程序标记文件时,StackOverflowException会在运行时出现 a。

该样式被应用于ContextMenu附加到 a (或生成的树内容TreeViewItem的后续)的 a 的菜单项;DataTemplate当释放鼠标右键并且上下文菜单即将打开时,将引发异常。

的用例之一ContextMenu是:

<DataTemplate x:Key="TviChaptersHeaderTemplate">
<StackPanel Orientation="Horizontal" Margin="0,2,0,2">
    <Image Margin="2,0,0,0" Width="16" Height="16" Source="\Icons\pages.png" />
            <TextBlock Text="{Binding}" Margin="5,0" />

    <StackPanel.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="Add Chapter" 
                              Style="{StaticResource STYLE}" />
                </ContextMenu>
            </StackPanel.ContextMenu>
</StackPanel>
</DataTemplate>

该异常已隔离到<ContentPresenter />标头模板内的标记。注释掉它会清除异常。这里发生了什么?

4

1 回答 1

2

我相信ContentPresenter拥有整个MenuItem,所以你基本上是在设置嵌套

<MenuItem>
    <Header>
        <MenuItem>
            <Header>
                ... etc. 

尝试使用类似的东西<ContentPresenter Content="{TemplateBinding Content}" />(这可能不是确切的语法,但你基本上想绑定到的Content部分,而ContentPresenter不是整个东西)

于 2012-01-01T17:08:08.977 回答