我正在尝试添加嵌套(子)菜单项。显示主菜单项,但不显示子菜单项。显然我缺少一个属性,但无法弄清楚。任何指点将不胜感激。
还尝试将子菜单项添加到 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 也存在同样的问题。
发现删除对第 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 */;
}
}