检测SplitContainer崩溃时的变化

本文关键字:变化 崩溃 SplitContainer 检测 | 更新日期: 2023-09-27 18:19:20

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

你知道怎么做吗?

检测SplitContainer崩溃时的变化

为那些可能和我一样在寻找相同答案的人发布这篇文章。

不幸的是,SplitContainer没有为折叠的事件提供任何直接事件。我发现有用的是监控对面面板的sizechange和/或clientsizechange事件。

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

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

在下面的例子中,我有一个切换按钮(btnToggle),我希望检查状态遵循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;
}

没有确切的事件,但这是因为你应该知道什么时候它会崩溃,当它运行的代码:

splitContainer1.Panel1Collapsed = true;
// do your stuff

否则,您可以在SplitContainer控件上监视SplitterMovedSplitterMoving事件。

splitContainer.Panel1.VisibleChanged += (s, e) => { bool isPanel1Collapsed = splitContainer.Panel1Collapsed; };

在内部实现中,当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;
}