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)
来清除该值。
我的应用程序有侧边栏。这个侧边栏通常是折叠的(宽度 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)
来清除该值。