在WPF中的某些情况下会切断上下文菜单

时间:2011-12-07 09:09:20

标签: c# .net wpf .net-3.5 contextmenu

上下文菜单在不同的.NET Framework中被截断。查看ZIP文件中的图像(有两个截图,一个来自XP,另一个来自Win7)。

我创建了一个简单的Visual Studio 2010解决方案来重现我的问题。

http://www.mediafire.com/download.php?doq7gsh75qgvzwq)。

在XP上它似乎工作正常,但在Windows 7上没有。

如果目标.NET Framework为3.5(包括SP1),则可以在Windows 7上重现该问题(请参阅zip中的图像)。

如果我将目标框架更改为4.0,它在Windows 7上也可以正常工作。

是否可以在Windows 7操作系统上的.NET Framework 3.5中完全显示上下文菜单?

3 个答案:

答案 0 :(得分:4)

似乎在加载ContextMenu时,菜单的ScrollContentPresenter未正确调整大小,剪切ItemPresenter的{​​{1}}(下面是显示问题的视觉树的删节版本。)

MenuItem

在加载菜单时使PopupRoot, Acutal Width: 219,027, Desired Width: 219,027 Decorator, Acutal Width: 219,027, Desired Width: 219,027 NonLogicalAdornerDecorator, Acutal Width: 219,027, Desired Width: 219,027 ContextMenuProxy, Acutal Width: 219,027, Desired Width: 219,027 SystemDropShadowChrome, Acutal Width: 214,027, Desired Width: 219,027 Border, Acutal Width: 214,027, Desired Width: 214,027 Grid, Acutal Width: 212,027, Desired Width: 212,027 Rectangle, Acutal Width: 28,000, Desired Width: 32,000 Rectangle, Acutal Width: 1,000, Desired Width: 31,000 Rectangle, Acutal Width: 1,000, Desired Width: 32,000 ScrollViewer, Acutal Width: 210,027, Desired Width: 212,027 Grid, Acutal Width: 210,027, Desired Width: 210,027 Border, Acutal Width: 210,027, Desired Width: 210,027 ScrollContentPresenter, Acutal Width: 210,027, Desired Width: 210,027 ItemsPresenter, Acutal Width: 241,047, Desired Width: 245,047 的可视化根(ContextMenu)的度量无效应该导致更新布局以显示{的正确边界{1}}。

菜单加载事件的处理程序:

PopupRoot

GetVisualTreeRoot方法:

ItemsPresenter

答案 1 :(得分:1)

解决方法:

<ContextMenu x:Name="mainMenu" Width="300" >

设置固定宽度时似乎停止了打扰。 仍然是Connect的一个很好的候选人。

答案 2 :(得分:0)

我也可以在.Net 4.5.1中重现这个问题。 也无法解决使用上述标记的解决方案。 InvalidateMeasure仍会导致 有时空的上下文菜单,它开始出现。当我窥探上下文菜单时, 发现菜单ItemsPanel大小计算完成得很好,但ScrollContentPresenter大小为0.Anyone面临类似问题。 我的解决方法是:

    private static void ContextMenuOnLoaded(object sender, RoutedEventArgs routedEventArgs)
    {
        var menu = (ContextMenu)sender;
        if (menu.HasItems)
        {
            menu.MinHeight = menu.Items.Count * 25;
        }

        menu.Loaded -= ContextMenuOnLoaded;
    }

不确定这是否是最佳解决方案。但为什么会发生这种情况也令人惊讶。