Pertanyaan Deteksi saat SplitContainer menciutkan perubahan


Saya memiliki SplitContainer Saya ingin menangkap peristiwa collapsing dan memperluas Panel2.

Tahu bagaimana melakukan itu?


4
2018-01-04 13:42


asal


Jawaban:


Memposting ini untuk orang lain yang mungkin berburu untuk jawaban yang sama seperti saya.

Sayangnya, SplitContainer tidak menawarkan acara langsung apa pun untuk acara yang diciutkan. Apa yang saya anggap berguna adalah untuk memantau peristiwa SizeChanged dan / atau ClientSizeChanged dari panel OPPOSITE ke panel yang Anda tutup.

Artinya, jika saya tertarik untuk memantau runtuhnya Panel2, saya akan berlangganan acara ClientSizeChanged untuk Panel1.

Dalam prakteknya saya akan merekomendasikan pemantauan ClientSizeChanged untuk kedua panel dari SplitContainer untuk menjamin Anda tidak melewatkan suatu inisialisasi atau gerakan splitter langsung.

Dalam contoh di bawah ini saya memiliki tombol toggle (btnToggle) yang saya inginkan status Checked untuk mengikuti visibilitas Panel2 di SplitContainer:

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;
}

6
2017-08-01 11:53



Tidak ada acara yang tepat untuk itu, tetapi itu karena Anda harus tahu ketika itu semakin runtuh ketika kode itu dijalankan:

splitContainer1.Panel1Collapsed = true;
// do your stuff

Jika tidak, Anda dapat menonton untuk SplitterMoved atau SplitterMoving acara pada kontrol SplitContainer.


1
2018-01-04 13:57



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

1
2017-12-15 09:55



Dalam implementasi internal, ketika panel dalam SplitContainer diruntuhkan, adalah Visible properti diatur ke false dan sebaliknya. Oleh karena itu mungkin untuk mendeteksi perubahan ketika panel runtuh dengan menangani VisibleChanged acara panel yang diinginkan.

Hasil tangkapan adalah bahwa SplitterPanel kelas tidak mengekspos acara ini. Namun, karena mewarisi Panel kelas yang mengekspos acara ini, Anda dapat mentransmisikan ke a Panel dan menangani acara dari sana seperti yang ditunjukkan dalam kode contoh di bawah ini.

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;
}

0
2018-06-28 02:58