Использование ContentPresenter внутри MenuItem HeaderTemplate вызывает исключение StackOverflowException - PullRequest
1 голос
/ 31 декабря 2011

Обратите внимание на следующую разметку:

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

Когда этот стиль добавляется в файл разметки приложения, во время выполнения возникает StackOverflowException.

Стиль применяется к элементам меню ContextMenu, который присоединен к TreeViewItem (или к последующему 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 /> внутри шаблона заголовка.Комментируя это очищает исключение.Что здесь происходит?

1 Ответ

2 голосов
/ 01 января 2012

Я думаю, ContentPresenter содержит все MenuItem, так что вы в основном настраиваете вложенные

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

Попробуйте использовать что-то вроде <ContentPresenter Content="{TemplateBinding Content}" /> (возможно, это не точный синтаксис, но вы в основном хотите связать с Content частью ContentPresenter, а не со всем)

...