上下文菜单在不同的 .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 OS 上的 .NET Framework 3.5 中是否有使上下文菜单完全可见的解决方案?

最佳答案

似乎当加载 ContextMenu 时,菜单的 ScrollContentPresenter 大小不正确,剪切 ItemPresenterMenuItem (以下是显示问题的可视化树的删节版本)。

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 的可视根( PopupRoot )的度量无效应该会导致更新布局以显示 ItemsPresenter 的正确边界。

菜单的 Load 事件的处理程序:
private void mainMenu_Loaded(object sender, RoutedEventArgs e)
{
    if (sender != null)
    {
        ContextMenu menu = sender as ContextMenu;
        if (menu != null)
        {
           // get the visual root for the context menu
           var root = (FrameworkElement)GetVisualTreeRoot(menu);

           // invalidate the menu's layout
           root.InvalidateMeasure();
        }
    }
}

GetVisualTreeRoot 方法:
private DependencyObject GetVisualTreeRoot(DependencyObject control)
{
    DependencyObject parent = VisualTreeHelper.GetParent(control);
    if (parent != null)
    {
        return GetVisualTreeRoot(parent);
    }
    else
    {
        return control;
    }
}

关于c# - WPF中某些情况下的上下文菜单被剪切,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8412747/

10-16 20:33