Pertanyaan Merancang Windows.Form dengan beberapa panel -> Cara menyembunyikan satu panel (seperti lapisan PS)


Bagaimana saya bisa menyembunyikan satu panel di Visual Studio 2008 Form Designer seperti lapisan di PS? Jika tidak, dapatkah seseorang merekomendasikan metode lain yang lebih baik untuk merancang beberapa "layar" yang harus diklik oleh pengguna?


4
2017-08-10 22:27


asal


Jawaban:


Apa yang Anda gambarkan adalah seorang penyihir, dan Anda mungkin ingin menyelidiki pendekatan dari Eric J. 

Namun, ketika saya memiliki kasus di mana saya ingin memiliki beberapa panel di ruang yang sama dalam UI saya dan saya ingin beralih di antara mereka di perancang, saya suka menggunakan TabControl dan menyembunyikan tab pada TabControl. Ini membuat UI lebih mudah dikelola pada waktu desain dan kode cukup mudah untuk beralih antar tab pada waktu proses.

Saya membuat kontrol kustom yang berasal dari TabControl disebut HiddenTabsControl yang sangat sederhana. Kelas hanya menimpa WndProc dan memungkinkan kelas dasar TabControl menangani yang lainnya. Yang perlu Anda lakukan adalah:

  • Tambahkan Item Baru ke proyek Anda
  • Pilih Kontrol Kustom,
  • Beri nama sesuatu seperti HiddenTabsControl.
  • Ubah Kelas dasar ke TabControl, hapus Konstruktor dan OnPaint menimpa yang ditambahkan oleh Visual Studio.
  • Salin penimpaan ini untuk WndProc ke dalam kelas:

    protected override void WndProc(ref Message m)
    {
        // Hide tabs by trapping the TCM_ADJUSTRECT message
        if (m.Msg == 0x1328 && !DesignMode)
        {
            m.Result = (IntPtr)1;
        }
        else
        {
            base.WndProc(ref m);
        }
    }  
    

Sekarang Anda dapat mengubah tab di perancang dan mendesain UI dengan mudah dan dalam kode Anda dapat menangani acara untuk mengubah tab sesuai kebutuhan. Mengubah tab yang Dipilih mudah dilakukan dengan:

this.hiddenTabsControl.SelectedTab = this.tabPageYouWantVisible;

Salah satu efek samping menghilangkan tab adalah ruang yang ditempati tab saat kontrol dibangun. Menghapusnya akan membuat ruang HiddenTabsControl menempati perubahan dengan menyusutkannya. Saya biasanya mengatur Anchor of the HiddenTabsControl ke bawah agar tidak mengecil.


17
2017-08-12 17:58



Saya menggunakan Wizard ini kode dalam proyek baru-baru ini dan itu bekerja dengan baik.

Ini memberikan pengalaman dasar yang Anda cari.


2
2017-08-10 22:31



Lain kurang elegan, tetapi cepat hack, pendekatan adalah dengan tidak menambahkan panel ke bentuk induk sampai runtime. Dalam melakukan itu, perancang tidak tahu di mana panel milik sebelum kompilasi, dan itu tidak akan ditampilkan.

Misalnya, temukan blok kode tempat Anda menambahkan kontrol ke bentuk induk:

                //this->Controls->Add(this->panel_X);
        this->Controls->Add(this->tabControl);
        this->Controls->Add(this->menuStrip_topMenu);

Berikan komentar atau hapus pernyataan, lalu temukan pegangan ke peristiwa yang terjadi saat formulir dimuat:

        this->Load += gcnew System::EventHandler(this, &MainForm::MainForm_Load);

Kemudian dalam definisi pengendali event, tambahkan kontrol ke form:

System::Void MainForm_Load(System::Object^  sender, System::EventArgs^  e) {
...
...
this->Controls->Add(this->panel_X);
}

Saya belum mengalami efek samping yang tidak diinginkan dengan melakukan ini, tetapi jika ada yang punya alasan kuat untuk tidak saya akan tertarik untuk mendengarnya.


2
2017-12-21 16:18