上下文菜单在不同的 .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
大小不正确,剪切 ItemPresenter
的 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();
}
}
}
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/