1

次のマークアップに注意してください。

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

このスタイルがアプリケーション マークアップ ファイルに追加されると、StackOverflowException実行時に が発生します。

スタイルは、(または生成されたツリー コンテンツの後続の)ContextMenuにアタッチされている のメニュー項目に適用されています。マウスの右ボタンが離され、コンテキスト メニューが開かれる予定である場合、例外がスローされます。TreeViewItemDataTemplate

の使用例の 1 つを次に示します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}" />にバインドしたい)ContentContentPresenter

于 2012-01-01T17:08:08.977 に答える