代码之家  ›  专栏  ›  技术社区  ›  Rachel

WPF-项目更改时重新绘制上下文菜单?

  •  0
  • Rachel  · 技术社区  · 14 年前

    我在ScrollViewer中有一个ItemsControl,当项目超过ScrollViewer的宽度时,它们会被放入ContextMenu中,并显示为下拉列表。我的问题是,当第一次加载上下文菜单时,它会保存保存菜单的大小,并且在添加/删除更多命令时不会重新绘制。

    例如,面板有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上传递一个空委托来尝试强制重画,但是这两种方法都不起作用。我正在使用.NET4.0。

    1 回复  |  直到 7 年前
        1
  •  2
  •   decyclone    14 年前

    MenuCommands是一个集合吗?如果是,这是一个可观察的集合吗?

    如果将集合绑定到 项目控件 接口让 项目控件