【问题标题】:Detect when SplitContainer collapsed changes检测 SplitContainer 折叠更改的时间
【发布时间】:2015-06-28 10:58:00
【问题描述】:

我有一个 SplitContainer,我想捕捉 Panel2 折叠和展开事件。

知道怎么做吗?

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    将此发布给其他可能正在寻找与我相同答案的人。

    不幸的是,SplitContainer 不为折叠事件提供任何直接事件。我发现有用的是监视 OPPOSITE 面板的 SizeChanged 和/或 ClientSizeChanged 事件到您正在折叠的面板。

    意思是,如果我对监控 Panel2 的崩溃感兴趣,我会订阅 Panel1 的 ClientSizeChanged 事件。

    在实践中,我建议监控 SplitContainer 的两个面板的 ClientSizeChanged,以确保您不会错过任何初始化或直接拆分器移动。

    在下面的示例中,我有一个切换按钮 (btnToggle),我希望 Checked 状态遵循 SplitContainer 中 Panel2 的可见性:

    private void splitContainer_Panel2_ClientSizeChanged(object sender, EventArgs e)
    {
            btnToggle.Checked = !splitContainer.Panel2Collapsed;
    }
    
    private void splitContainer_Panel1_ClientSizeChanged(object sender, EventArgs e)
    {
            btnToggle.Checked = !splitContainer.Panel2Collapsed;
    }
    

    【讨论】:

      【解决方案2】:

      没有确切的事件,但那是因为当它运行的代码时你应该知道它什么时候被折叠:

      splitContainer1.Panel1Collapsed = true;
      // do your stuff
      

      否则,您可以在 SplitContainer 控件上观察SplitterMovedSplitterMoving 事件。

      【讨论】:

      • SplitterMoved 仅在从折叠模式转换到展开模式时起作用,SplitterMoving 不会触发折叠和展开任何想法。我知道 Panel1Collapsed 和 Panel2Collapsed 任何想法
      • @AMH 用户无法折叠面板,这意味着您可以控制它。当您设置Panel1Collapsed=true; 时,您应该做任何您想做的事情。很难理解这个问题。也许发布一些你正在尝试做的代码(编辑你的问题)。
      【解决方案3】:
      splitContainer.Panel1.VisibleChanged += (s, e) => { bool isPanel1Collapsed = splitContainer.Panel1Collapsed; };
      

      【讨论】:

        【解决方案4】:

        在内部实现中,当SplitContainer 中的面板折叠时,Visible 属性设置为false,反之亦然。因此,可以通过处理所需面板的VisibleChanged 事件来检测面板折叠时的变化。

        问题是SplitterPanel 类没有公开这个事件。但是,由于它继承了公开此事件的 Panel 类,因此您可以强制转换为 Panel 并从那里处理事件,如下面的示例代码所示。

        private void Initialize()
        {
            split = new SplitContainer();
            ((Panel)split.Panel1).VisibleChanged += splitPanel1_Collapsed;
        }
        
        private void splitPanel1_Collapsed(object sender, EventArgs e)
        {
            var panel = (SplitterPanel)sender;
            var panelCollapsed = !panel.Visible;
        }
        

        【讨论】:

        • 谢谢。上述解决方案的唯一问题是我的 Visual Studio 中不存在“panel.Visible”语法。
        • 您使用的是哪个版本的 Visual Studio?我在 VS2015、VS2017 和 VS2019 中测试过,无需修改即可使用。
        • 我的 Visual Studio 版本是 2005。也许我应该切换到较新的版本。感谢您的关注。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-27
        • 2012-02-26
        • 2017-08-30
        • 2015-06-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多