WPF 中某些情况下上下文菜单被剪切

2024-02-10

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

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

( http://www.mediafire.com/download.php?doq7gsh75qgvzwq 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 中完全可见?


似乎当ContextMenu已加载ScrollContentPresenter由于菜单大小不正确,请剪裁ItemPresenter of the 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的视觉根(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();
        }             
    }
}

获取VisualTreeRoot方法:

private DependencyObject GetVisualTreeRoot(DependencyObject control)
{
    DependencyObject parent = VisualTreeHelper.GetParent(control);
    if (parent != null)
    {
        return GetVisualTreeRoot(parent);
    }
    else
    {
        return control;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF 中某些情况下上下文菜单被剪切 的相关文章

随机推荐