1

необходимо соблюдать следующую разметку:Использование ContentPresenter внутри MenuItem HeaderTemplate вызывает StackOverflowException

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

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

Стиль применяется к пунктам меню ContextMenu, который прикреплен к TreeViewItem (или последующему для сгенерированного дерева); Исключение генерируется при отпускании правой кнопки мыши и открытии контекстного меню.

Один из вариантов использования для 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 /> тега внутри шаблона заголовка. Замечание об этом исключает исключение. Что тут происходит?

+0

Я могу воспроизвести переполнение стека, которое вы получаете. Однако мне непонятно, чего вы пытаетесь достичь. Не могли бы вы объяснить, почему вы пытаетесь использовать ContentPresenter таким образом? –

+0

Luke - The HeaderTemplate, показанный в этом примере, заглушен, чтобы выделить проблему. Однако ContentPresenter фактически вложен в более сложный контент в производственный код. –

+0

Вы не ответили на мой вопрос. * Почему вам нужно использовать «ContentPresenter» таким образом? –

ответ

2

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

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

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

Смежные вопросы