2011-12-31 38 views
1

請遵守以下標記:使用菜單項HeaderTemplate中的內部ContentPresenter導致StackOverflowException

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

當這種風格被添加到應用程序的標記文件,StackOverflowException在運行時發生。

該樣式正在應用於附加到TreeViewItem(或生成的樹內容的後續DataTemplate)的ContextMenu的菜單項;當鼠標右鍵被釋放並且上下文菜單打開時,該異常會引發。

一個用例爲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嗎? – 2011-12-31 12:55:28

+0

Luke-爲了突出顯示問題,本示例中顯示的HeaderTemplate已被刪除。但是,ContentPresenter實際上嵌套在生產代碼中更復雜的內容中。 – 2011-12-31 19:21:07

+0

您還沒有回答我的問題。 *爲什麼*你需要使用ContentPresenter這種方式? – 2011-12-31 22:12:19

回答

2

我相信ContentPresenter包含整個MenuItem,所以你基本上是建立嵌套

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

嘗試使用類似<ContentPresenter Content="{TemplateBinding Content}" />(這可能不是確切的語法,但你基本上要綁定到Content部分ContentPresenter,不是全部)

相關問題