我在 ScrollViewer 中有一个 ItemsControl,当项目超过 ScrollViewer 的宽度时,它们被放入 ContextMenu 并显示为 DropDown。我的问题是,当第一次加载上下文菜单时,它会保存菜单的大小,并且在添加/删除更多命令时不会重绘。
例如,一个面板有 3 个命令。1 可见,2 在菜单中。查看菜单会显示 2 个命令并绘制控件,但是如果您调整面板的大小以使 2 个可见并且菜单中只有 1 个命令,则它不会重新绘制菜单以消除第二个菜单项。或者更糟糕的是,如果您缩小面板以使不显示任何命令并且所有 3 个命令都在菜单中,它只会显示前 2 个命令。
这是我的代码:
<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。