添加嵌套菜单项时出现问题 - 嵌套项目未显示

问题描述 投票:0回答:1

我正在尝试添加嵌套(子)菜单项。显示主菜单项,但不显示子菜单项。显然我缺少一个属性,但无法弄清楚。任何指点将不胜感激。

还尝试将子菜单项添加到 ContextMenu,然后将其添加到 MenuItem ContextMenu 属性,但这也不起作用。

Private Function ReturnContexMenu() As ContextMenu
Try
    Dim FlagMI As New MenuItem
    With FlagMI
        .Header = "Quick Flag"
        .Name = "FlagMI"
    End With
    RegisterControl(Inbox_Grid, FlagMI)

    Dim MarkReadMI As New MenuItem
    With MarkReadMI
        .Header = "Mark as read"
        .Name = "MarkReadMI"
    End With
    RegisterControl(Inbox_Grid, MarkReadMI)

    Dim MarkUnreadMI As New MenuItem
    With MarkUnreadMI
        .Header = "Mark as unread"
        .Name = "MarkUnreadMI"
    End With
    RegisterControl(Inbox_Grid, MarkUnreadMI)

    Dim MarkAsMI As New MenuItem
    With MarkAsMI
        .Header = "Mark as "
        .Items.Add(MarkReadMI)
        .Items.Add(MarkUnreadMI)
    End With

    Dim vMainContext As New ContextMenu
    With vMainContext
        .Name = "MainContextMenu"

        .Items.Add(FlagMI)
        .Items.Add(MarkAsMI)
    End With

    Return vMainContext
Catch ex As Exception
    EmailError(ex)
    Return Nothing
End Try
End Function  

==========已更新==================

正如您从屏幕截图中看到的,子菜单项没有显示!也用按钮尝试过,结果相同。这可能是 .NET 8 的问题吗? - 没有!使用按钮的 .NET 4.8 也存在同样的问题。

wpf contextmenu dotnetbar
1个回答
1
投票

发现删除对第 3 方控件库的引用后问题就消失了,我们可以得出结论,该库正在通过提供隐式

Style
来更改默认布局。
这个
Style
似乎删除了子项目的项目宿主,这就是
MenuItem
的子项目不再渲染的原因。

利用有关 依赖属性优先级列表 的知识,我们知道可以通过设置本地值来防止应用任何隐式

Style
,例如
null
Nothing
。这样
MenuItem
就被迫使用默认的
Style

VB.NET

Private Function ReturnContexMenu() As ContextMenu
    Try
        Dim FlagMI As MenuItem = New MenuItem() With {
            .Style = Nothing
        }

        If True Then
            Dim withBlock = FlagMI
            withBlock.Header = "Quick Flag"
            withBlock.Name = "FlagMI"
        End If

        RegisterControl(Inbox_Grid, FlagMI)
        Dim MarkReadMI As MenuItem = New MenuItem() With {
            .Style = Nothing
        }

        If True Then
            Dim withBlock = MarkReadMI
            withBlock.Header = "Mark as read"
            withBlock.Name = "MarkReadMI"
        End If

        RegisterControl(Inbox_Grid, MarkReadMI)
        Dim MarkUnreadMI As MenuItem = New MenuItem() With {
            .Style = Nothing
        }

        If True Then
            Dim withBlock = MarkUnreadMI
            withBlock.Header = "Mark as unread"
            withBlock.Name = "MarkUnreadMI"
        End If

        RegisterControl(Inbox_Grid, MarkUnreadMI)
        Dim MarkAsMI As MenuItem = New MenuItem() With {
            .Style = Nothing
        }

        If True Then
            Dim withBlock = MarkAsMI
            withBlock.Header = "Mark as "
            withBlock.Items.Add(MarkReadMI)
            withBlock.Items.Add(MarkUnreadMI)
        End If

        Dim vMainContext As ContextMenu = New ContextMenu()

        If True Then
            Dim withBlock = vMainContext
            withBlock.Name = "MainContextMenu"
            withBlock.Items.Add(FlagMI)
            withBlock.Items.Add(MarkAsMI)
        End If

        Return vMainContext
    Catch ex As Exception
        EmailError(ex)
        Return Nothing
    End Try
End Function

C#

private ContextMenu ReturnContexMenu()
{
    try
    {
        MenuItem FlagMI = new MenuItem() { Style = null };
        {
            var withBlock = FlagMI;
            withBlock.Header = "Quick Flag";
            withBlock.Name = "FlagMI";
        }
        RegisterControl(Inbox_Grid, FlagMI);

        MenuItem MarkReadMI = new MenuItem() { Style = null };
        {
            var withBlock = MarkReadMI;
            withBlock.Header = "Mark as read";
            withBlock.Name = "MarkReadMI";
        }
        RegisterControl(Inbox_Grid, MarkReadMI);

        MenuItem MarkUnreadMI = new MenuItem() { Style = null };
        {
            var withBlock = MarkUnreadMI;
            withBlock.Header = "Mark as unread";
            withBlock.Name = "MarkUnreadMI";
        }
        RegisterControl(Inbox_Grid, MarkUnreadMI);

        MenuItem MarkAsMI = new MenuItem() { Style = null };
        {
            var withBlock = MarkAsMI;
            withBlock.Header = "Mark as ";
            withBlock.Items.Add(MarkReadMI);
            withBlock.Items.Add(MarkUnreadMI);
        }

        ContextMenu vMainContext = new ContextMenu();
        {
            var withBlock = vMainContext;
            withBlock.Name = "MainContextMenu";

            withBlock.Items.Add(FlagMI);
            withBlock.Items.Add(MarkAsMI);
        }

        return vMainContext;
    }
    catch (Exception ex)
    {
        EmailError(ex);
        return null/* TODO Change to default(_) if this is not a reference type */;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.