在 MenuItem HeaderTemplate 内使用 ContentPresenter 会导致 StackOverflowException

发布于 2024-12-23 14:15:09 字数 1335 浏览 2 评论 0原文

请注意以下标记:

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

当将此样式添加到应用程序标记文件时,运行时会发生 StackOverflowException

该样式应用于附加到 TreeViewItemContextMenu 的菜单项(或用于生成树内容的后续 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>

异常已被隔离到标头模板内的 标记。注释掉它可以清除异常。这是怎么回事?

Please observe the following markup:

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

When this style is added to the application markup file, a StackOverflowException occurs at runtime.

The style is being applied to the menu items of a ContextMenu which is attached to a TreeViewItem (or a subsequent DataTemplate for generated tree content); The exception throws when the right mouse button is released and the context menu is due to open.

One of the use cases for the ContextMenu is:

<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>

The exception has been isolated to the <ContentPresenter /> tag inside the header template. Commenting it out clears the exception. What's going on here?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

仄言 2024-12-30 14:15:09

我相信 ContentPresenter 包含整个 MenuItem,因此您基本上是在设置嵌套

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

尝试使用类似 ; (这可能不是确切的语法,但您基本上希望绑定到 ContentPresenterContent 部分,而不是整个内容)

I believe ContentPresenter holds the entire MenuItem, so you're basically setting up nested

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

Try using something like <ContentPresenter Content="{TemplateBinding Content}" /> (That might not be the exact syntax, but you basically want to bind to the Content part of the ContentPresenter, not the entire thing)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文