【发布时间】:2015-06-28 10:58:00
【问题描述】:
我有一个 SplitContainer,我想捕捉 Panel2 折叠和展开事件。
知道怎么做吗?
【问题讨论】:
我有一个 SplitContainer,我想捕捉 Panel2 折叠和展开事件。
知道怎么做吗?
【问题讨论】:
将此发布给其他可能正在寻找与我相同答案的人。
不幸的是,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;
}
【讨论】:
没有确切的事件,但那是因为当它运行的代码时你应该知道它什么时候被折叠:
splitContainer1.Panel1Collapsed = true;
// do your stuff
否则,您可以在 SplitContainer 控件上观察SplitterMoved 或SplitterMoving 事件。
【讨论】:
Panel1Collapsed=true; 时,您应该做任何您想做的事情。很难理解这个问题。也许发布一些你正在尝试做的代码(编辑你的问题)。
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;
}
【讨论】: