У меня есть ItemsControl в ScrollViewer, и когда элементы превышают ширину 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.