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

问题描述 投票:1回答:1

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

<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>
...

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

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

<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重置为其默认值?

是否有更整洁,更优雅的解决方案?

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

enter image description here

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

wpf c#-4.0 wpf-controls
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.