WPF - перерисовка контекстного меню при изменении элементов? - PullRequest
0 голосов
/ 15 июня 2010

У меня есть ItemsControl в ScrollViewer, и когда элементы превышают ширину ScrollViewer, они помещаются в ContextMenu и вместо этого отображаются как DropDown. Моя проблема в том, что когда контекстное меню загружается впервые, оно сохраняет сохраненные размеры меню и не перерисовывается при добавлении / удалении большего количества команд.

Например, панель имеет 3 команды. 1 видно, а 2 находятся в меню. При просмотре меню отображаются 2 команды и отображается элемент управления, но затем, если вы измените размер панели, чтобы 2 были видны, а в меню была только 1 команда, меню не перерисовывается, чтобы исключить этот второй элемент меню. Или, что еще хуже, если вы укоротите панель так, чтобы никакие команды не отображались, а все 3 находились в меню, отобразятся только верхние 2.

https://i193.photobucket.com/albums/z197/Lady53461/ContextMenuRedraw.jpg

Вот мой код:

<Button Click="DropDownMenu_Click"
        ContextMenuOpening="DropDownMenu_ContextMenuOpening">

    <Button.ContextMenu>
        <ContextMenu ItemsSource="{Binding Path=MenuCommands}" Placement="Bottom">
            <ContextMenu.Resources>
                <Style TargetType="{x:Type MenuItem}">
                    <Setter Property="Command" Value="{Binding Path=Command}" />
                    <Setter Property="Visibility" Value="{Binding Path=IsVisible, Converter={StaticResource ReverseBooleanToVisibilityConverter}}"/>
                </Style>
            </ContextMenu.Resources>
            <ContextMenu.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Path=DisplayName}" />
                </DataTemplate>
            </ContextMenu.ItemTemplate>
        </ContextMenu>
    </Button.ContextMenu>
</Button>

Код позади:

        void DropDownMenu_ContextMenuOpening(object sender, ContextMenuEventArgs e)
    {
        Button b = sender as Button;
        b.ContextMenu.IsOpen = false;
        e.Handled = true;
    }

    private void DropDownMenu_Click(object sender, RoutedEventArgs e)
    {
        Button b = sender as Button;

        ContextMenu cMenu = b.ContextMenu;
        if (cMenu != null)
        {
            cMenu.PlacementTarget = b;
            cMenu.Placement = System.Windows.Controls.Primitives.PlacementMode.Bottom;
            cMenu.IsOpen = true;
        }
    }

Я попытался использовать InvalidateVisual и передать пустой делегат в Render, чтобы попытаться выполнить перерисовку, однако ни один из них не работает. Я использую .Net 4.0.

1 Ответ

2 голосов
/ 15 июня 2010

MenuCommands коллекция? Если это так, это ObservableCollection?

Если вы связываете коллекцию с ItemsControl , эта коллекция должна реализовать интерфейс INotifyCollectionChanged , чтобы ItemsControl знал, что количество элементов в коллекции изменен, так что элемент управления может «перерисовать» себя.

...