捕获可见性更改事件

本文关键字:事件 可见性 | 更新日期: 2023-09-27 18:31:55

我有一个包含ElementHost(System.Windows.Forms.Integration.ElementHost)的DockingManager(Syncfusion.Windows.Forms.Tools.DockingManager)。ElementHost 的子级是自定义 WPF userControl(elementHost 看到它有一个 FrameworkElement)。

我想在打开选项卡时处理事件。我尝试了很多东西(OnVisibilityChanged,IsHitTestVisibleChanged,DockVisibilityChange,VisibleChanged)。WPF 用户控件上的 OnVisibilityChanged 似乎有效,但似乎仅在第一次打开选项卡时触发。

我做了很多试验和错误,但似乎没有任何效果。我可以使用一些帮助。

捕获可见性更改事件

我厌倦了搜索。我做了一件愚蠢但快速的事情:

          dockingManager.DockControlActivated += handler1;
          dockingManager.DockControlDeactivated += handler2;
          dockingManager.DockMenuClick += handler3;
          dockingManager.DockStateChanged+=handler4;
          dockingManager.DockStateChanging += handler5;
          dockingManager.DockVisibilityChanged += handler6;
          dockingManager.DockVisibilityChanging += handler7;
          dockingManager.NewDockStateBeginLoad += handler8;
          dockingManager.NewDockStateEndLoad += handler9;
          dockingManager.DockAllow += handler10;
          dockingManager.ControlRestored += handler11;
          dockingManager.ControlMinimized += handler12;
          dockingManager.ControlMaximizing += handler13;
          dockingManager.ControlMaximized += handler14;
          dockingManager.AutoHideAnimationStop += handler15;
          dockingManager.AutoHideAnimationStart += handler16;
}
private void handler16(object sender, AutoHideAnimationEventArgs arg)
{
  int i=0;i++;
}
private void handler15(object sender, AutoHideAnimationEventArgs arg)
{
  int i=0;i++;
}
private void handler14(object sender, ControlMaximizedEventArgs args)
{
  int i=0;i++;
}
...

在每个处理程序中放置了一个断点,我发现AutoHideAnimationStop或AutoHideAnimationStart可以做到这一点。即使我用代码打开选项卡(即:dockingManager.ActivateControl(ElementHost);),它也会触发。我还可以查看参数,看看它是滚入还是滚出。

我的解决方案:

 private void OnLoadCompleted( object _sender )  
 {
   dockingManager.AutoHideAnimationStop += handler15;
 }
 private void handler15(object _sender, AutoHideAnimationEventArgs _arg)
 {
   MyUserControl childControl = (MyUserControl )MyElementHost.Child;
   if ( MyElementHost!= null && childControl != null && MyElementHost.Visible )
   {
     childControl.OnVisibilityChanged(_sender, _arg);
   }
 }