Контекстное меню в некоторых ситуациях вырезается в WPF - PullRequest
4 голосов
/ 07 декабря 2011

Контекстное меню усекается в разных .NET Framework.См. Изображения внутри ZIP-файла (есть два скриншота, один из XP и другой из Win7).

Я создал простое решение Visual Studio 2010, которое воспроизводит мою проблему.

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

В XP это работает нормально, но не в Windows 7.

Эта проблема может быть воспроизведена в Windows 7, если целевой .NET Framework 3.5 (включая SP1) (см. изображение из zip).

Если я изменю целевой фреймворк на 4.0, он отлично работает и в Windows 7.

Это решение, позволяющее сделать контекстное меню полностью видимым в .NET Framework 3.5.в ОС Windows 7?

Ответы [ 3 ]

4 голосов
/ 17 марта 2012

Кажется, что когда ContextMenu загружен, ScrollContentPresenter для меню имеет неправильный размер, отсечение ItemPresenter из MenuItem s (Ниже приведена сокращенная версия визуального дерева, показывающая проблему ). * * 1005

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.

Обработчик события загрузки меню:

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;
    }
}
1 голос
/ 17 марта 2012

Обходной путь:

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

Кажется, перестает беспокоить при установке фиксированной ширины.Все еще хороший кандидат на Connect.

0 голосов
/ 14 июля 2014

Я также могу воспроизвести эту проблему в .Net 4.5.1. Не удается решить, используя вышеуказанное решение. InvalidateMeasure по-прежнему приводит к иногда пустое контекстное меню, и оно начинает появляться. Когда я слежу за контекстным меню, Выяснилось, что в меню ItemsPanel вычисление размера выполнено нормально, но ScrollContentPresenter имеет размер 0. Никто не сталкивался с подобными проблемами Мой обходной путь:

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

        menu.Loaded -= ContextMenuOnLoaded;
    }

Не уверен, что это лучшее решение. Но почему это происходит, тоже удивительно.

...