WPF 样式触发器:在可变宽度网格上使用上下文菜单

WPF Style Triggers: Using a Context Menu on Variable Width Grid

我的应用程序有侧边栏。这个侧边栏通常是折叠的(宽度 20 像素),但是当我将鼠标悬停在侧边栏上时,它会展开(600 像素)。这是在 WPF 中设置的 "IsMouseOver" 属性 on a grid

<Grid VerticalAlignment="Stretch" HorizontalAlignment="Left" Margin="5 30" Name="GridCollapsible">
 <Grid.Style>
  <Style TargetType="{x:Type Grid}">
   <Style.Triggers>
    <Trigger Property="IsMouseOver" Value="True">
     <Setter Property="Width" Value="600"/>
    </Trigger>
    <Trigger Property="IsMouseOver" Value="False">
     <Setter Property="Width" Value="20"/>
    </Trigger>
   </Style.Triggers>
  </Style>
 </Grid.Style> 
 ...

此网格的子元素之一是 ListView。这个 ListView 有一个 ContextMenu

<ListView Name="TodayCalendarListBox" Margin="0 10 0 0" FontSize="16" HorizontalContentAlignment="Stretch" DockPanel.Dock="Top">
 <ListView.ContextMenu>
  <ContextMenu>
   <MenuItem Header="Completed" Click="CompletedMenuItem_Click"/>
   <MenuItem Header="Missed" Click="MissedMenuItem_Click"/>
  </ContextMenu>
 </ListView.ContextMenu>
...

当我右键单击列表视图项并打开上下文菜单时,上下文菜单在后台打开。

我目前已尝试在作为 ListView 的父容器的 DockPanel 中订阅 ContextMenuOpening 和 ContextMenuClosing 事件

<DockPanel Margin="8" ContextMenuOpening="ContextMenu_ContextMenuOpening" ContextMenuClosing="ContextMenu_ContextMenuClosing">
        private void ContextMenu_ContextMenuOpening(object sender, ContextMenuEventArgs e)
        {
            GridCollapsible.Width = 600;
        }

        private void ContextMenu_ContextMenuClosing(object sender, ContextMenuEventArgs e)
        {
            GridCollapsible.Width = 20;
        }

这些事件按预期触发,手动将代码中的宽度固定为 600 使上下文菜单按预期出现在我的可折叠网格的顶部。 但是,我无法重新激活 MouseOver 触发器 - 我的可折叠网格永久固定在 20 的宽度,无论鼠标是否悬停。

如何重置网格宽度,使其作为鼠标悬停在触发器上运行?我可以将什么代码添加到上下文菜单关闭事件以将 collapsibleGrid 重置为默认值?

是否有更简洁、更优雅的解决方案?

为清楚起见,情况图片(没有鼠标悬停 --> 鼠标悬停和上下文菜单)。

不是将 属性 设置为本地值,而是在 ContextMenu_ContextMenuOpening 中调用 GridCollapsible.SetValue(Grid.WidthProperty, 600.0),然后通过在 ContextMenu_ContextMenuClosing 中调用 GridCollapsible.ClearValue(Grid.WidthProperty) 来清除该值。