.net 当另一个ContextMenu打开时,ContextMenu Close事件不触发

jucafojl  于 2023-11-20  发布在  .NET
关注(0)|答案(1)|浏览(292)

我认为我的项目中有错误的逻辑,所以我做了一个新的项目,只有以下内容:

  1. <Window>
  2. <Grid>
  3. <TreeView>
  4. <TreeViewItem Header="Test1"/>
  5. <TreeViewItem Header="Test2"/>
  6. <TreeViewItem Header="Test3"/>
  7. <TreeViewItem Header="Test4"/>
  8. <TreeView.Resources>
  9. <ContextMenu x:Key="TreeViewContextMenu">
  10. <MenuItem Header="Click Me!"/>
  11. </ContextMenu>
  12. <Style TargetType="TreeViewItem">
  13. <Setter Property="ContextMenu" Value="{StaticResource TreeViewContextMenu}"/>
  14. <EventSetter Event="ContextMenuOpening" Handler="TreeViewContextMenu_Opening"/>
  15. <EventSetter Event="ContextMenuClosing" Handler="TreeViewContextMenu_Closing"/>
  16. </Style>
  17. </TreeView.Resources>
  18. </TreeView>
  19. </Grid>
  20. </Window>

字符串
当我在ContextMenu开启的情况下按一下鼠标器右击(以开启ContextMenu)时,无论我在ContextMenu、TreeViewItem或TreeView中是否有事件行程常式,都不会触发closing/closed事件。
当按住右键单击或左键单击时,当然不会发生这种情况。
Demonstration的一个。

gcxthw6b

gcxthw6b1#

你知道你让多个TreeViewItem共享一个ContextMenu吗?我看不出有什么好的理由这样做。你的TreeView应该像下面这样修改。

  1. <TreeView>
  2. <TreeViewItem Header="Test1"/>
  3. <TreeViewItem Header="Test2"/>
  4. <TreeViewItem Header="Test3"/>
  5. <TreeViewItem Header="Test4"/>
  6. <TreeView.Resources>
  7. <Style TargetType="TreeViewItem">
  8. <Setter Property="ContextMenu">
  9. <Setter.Value>
  10. <ContextMenu>
  11. <MenuItem Header="Click Me!"/>
  12. </ContextMenu>
  13. </Setter.Value>
  14. </Setter>
  15. <EventSetter Event="ContextMenuOpening" Handler="TreeViewContextMenu_Opening"/>
  16. <EventSetter Event="ContextMenuClosing" Handler="TreeViewContextMenu_Closing"/>
  17. </Style>
  18. </TreeView.Resources>
  19. </TreeView>

字符串

编辑

我在TreeViewContextMenu_Opening事件处理程序中检查了TreeViewItem的ContextMenu示例。

  1. private ContextMenu? _contextMenu;
  2. private void TreeViewContextMenu_Opening(object sender, ContextMenuEventArgs e)
  3. {
  4. var contextMenu = ((TreeViewItem)sender).ContextMenu;
  5. Debug.WriteLine($"Opening {contextMenu is not null} {object.ReferenceEquals(contextMenu, _contextMenu)}");
  6. _contextMenu = contextMenu;
  7. _contextMenu.Closed += OnClosed;
  8. void OnClosed(object sender, RoutedEventArgs e)
  9. {
  10. ((ContextMenu)sender).Closed -= OnClosed;
  11. _contextMenu = null;
  12. Debug.WriteLine("Closed");
  13. }
  14. }


我发现,当一个ContextMenu被打开,而一个ContextMenu已经被打开时,ContextMenu的示例是相同的,ContextMenu.Closed事件没有触发。这意味着在这种情况下,相同的ContextMenu被重用。
当然,您将没有机会捕获TreeViewContextMenu_Closing事件,因为ContextMenu不会关闭。

展开查看全部

相关问题