Pertanyaan Grid vs. Canvas


Saya mencari pendapat tentang menggunakan panel Kanvas vs. Grid di WPF. Saya perlu membuat formulir masukan klasik yang pada dasarnya memiliki tata letak kisi, beberapa mungkin memiliki datagrid kecil di dalam, kotak grup, tetapi semuanya sejajar dalam tata letak kisi. Saya berjuang apakah akan menggunakan Grid atau panel Kanvas untuk semua formulir saya. Grid memberi saya struktur yang bagus; Saya dapat mempertahankan keselarasan kontrol lebih mudah¬. Saya akan memiliki kelas dasar (yang mewarisi kelas Window) untuk semua jendela, sehingga perancang di Visual Studio tidak akan berguna, karena memiliki masalah untuk mewarisi semacam ini, dan dengan panel Grid saya tidak benar-benar membutuhkan desainer, dan saya dapat atur jendela UkuranToContent jadi semuanya akan baik-baik saja. Tetapi sekali lagi dengan Canvas, saya memiliki kemampuan untuk memosisikan kontrol dengan cara apa pun yang saya suka, dan ini hanya manfaat yang saya lihat ketika menggunakan Canvas.

Saya tidak memiliki banyak pengalaman di WPF untuk memprediksi jenis masalah apa yang bisa saya dapatkan dari permintaan pelanggan tentang tata letak. Pada formulir web, terkadang saya menggunakan penentuan posisi mutlak untuk berjaga-jaga jika pelanggan memiliki beberapa permintaan "khusus" apakah memiliki piksel kontrol kanan atau kiri pada yang lebih tinggi, dll. Semua orang bekerja dengan pelanggan yang menuntut tahu apa yang saya maksud.

Saya ingin melihat apa yang Anda pikirkan, apa pro dan kontra untuk keduanya dalam aplikasi tata letak bentuk aplikasi bisnis? Kenapa yang satu lebih baik dari yang lain? Setiap kasus di mana satu panel akan buruk digunakan, dan yang lainnya tidak? Apa kerugian dari satu panel ke panel lainnya? Panel apa yang akan Anda gunakan?

Terima kasih


11
2017-07-02 18:18


asal


Jawaban:


Kanvas sebagian besar ditujukan untuk fungsi menggambar kustom lebih dari yang lain. Grid pasti pilihan terbaik yang tersedia untuk menyesuaikan tata letak Anda.


16
2017-07-02 18:22



Anda bisa mendapatkan cukup mendalam dengan tata letak aktual grid, kolom / rentang baris, lebar, tinggi, dll.

Menurut saya, akan lebih mudah untuk melakukan tata letak berbagai item pada grid dengan mengontrol ukuran baris dan kolom daripada melakukan segala sesuatu yang dikodekan menjadi kanvas. Ini juga akan membuat segalanya lebih mudah jika mereka memutuskan untuk mengubah resolusi nanti di jalan.

Dari Adam Nathan WPF Unleashed (halaman 168):

Meniru Canvas dengan Grid   Jika Anda meninggalkan Grid dengan satu baris dan kolom dan mengatur HorizontalAlignment dan   VertikalAlignment dari semua anak ke nilai selain Stretch, anak-anak ditambahkan ke   sel tunggal seperti Kanvas. Pengaturan HorizontalAlignment ke Kiri dan   VerticalAlignment to Top seperti pengaturan Canvas.Left dan Canvas.Top ke 0. Pengaturan   HorizontalAlignment ke Right and VerticalAlignment to Bottom seperti pengaturan   Canvas.Right dan Canvas.Bottom to 0. Selanjutnya, menerapkan nilai Margin untuk masing-masing   elemen dapat memberi Anda efek yang sama seperti menyetel properti yang dilekatkan Canvas ke yang sama   nilai-nilai.

Anda juga bisa menjadi kreatif dengan konten kontrol Anda di grid untuk memiliki tingkat kontrol tata letak yang lebih baik.

Sebuah kanvas akan baik untuk sesuatu seperti kotak dialog yang jarang akan mengubah ukuran, dan hanya memiliki beberapa kontrol di atasnya, karena itu akan memakan waktu lama untuk meletakkannya semua karena jumlahnya bertambah.

Saya pribadi menggunakan grid sendiri. Ini bisa menjadi pekerjaan yang lebih sedikit untuk meletakkan hal-hal ke tingkat piksel tetapi untuk 5% dari waktu yang diperlukan itu sangat berharga untuk mengaburkan banyak kerumitan. Ini juga bagus ketika ada kebutuhan untuk mengubah ukuran baris dan kolom dengan cepat, GridSplitter membuat sekejap.


3
2017-07-02 22:39



Pastinya Grids tampaknya menjadi apa yang Anda butuhkan untuk kebutuhan Anda.

Saya akan menyamakan Grid ke tabel dalam html (sangat berguna ketika digunakan dengan tepat), sementara Canvas lebih seperti sebuah div. Perbedaannya adalah bahwa Grids adalah tabel apa yang seharusnya dalam HTML dan juga dengan div's vs Canvas.

Pada topik grid, luangkan waktu untuk mendefinisikan RowDefinitions dan ColumnDefinitions Anda, daripada menempatkan margin pada kontrol Anda untuk memposisikan semuanya dengan benar. Anda akan menyesal jika tidak.


2
2017-07-02 21:23



Meskipun Anda tidak dapat menggunakan VS Designer, Anda masih dapat menggunakan perancang visual XAML untuk membuat / mengedit konten grid Anda.

Salah satu manfaat UX utama dari WPF / SL / XAML adalah kemampuan tata letak 'cair' seperti-HTML. Meskipun Anda mungkin tidak membutuhkannya dengan desain Anda saat ini, jelas ini adalah masa depan dan layak dipelajari bagaimana keterampilan.

Periksa daftar lengkap Rob Relyea yang tersedia Editor XAML 


0
2017-07-03 16:24



Saya akan pergi dengan Grid atau subclass Grid khusus. Anda benar tentang Warisan tampilan. Perancang Visual Studio di UWP, WPF menghasilkan kode dukungan untuk basis dan subkelas dengan nama metode yang sama. Itu tidak dikompilasi.

Karena saya sudah menganjurkan generik, kita bisa kembali ke metodologi sebelumnya. Salah satunya adalah kelas penolong. Setiap alat Lihat IBaseView dan memiliki properti ViewHelper atau ViewHelper<T>. enum ViewHelperOptions mungkin dibutuhkan. Jika diperlukan, masing-masing ViewHelpers dapat menggunakan warisan tanpa merusak Visual Designer. Ini memungkinkan penggunaan kode generik serta kode tampilan khusus tanpa melanggar model MVVM. Sebut saja MVHVM karena ViewHelper memiliki pengetahuan tentang ViewHelper. Ini semakin memisahkan V dari VM.

Implementasi penuh mungkin membutuhkan penggunaan Activator.CreateInstance. Pertimbangan lain adalah Konstruktor yang dipanggil oleh perancang. Anda harus memindahkan semua kode "will-crash-if-not-running" menjadi Inisialisasi yang dihasilkan dari (katakanlah) acara Loaded. Atau Anda dapat menggunakan (UWP):

if (!Windows.ApplicationModel.DesignMode.DesignModeEnabled)
{ DoStuffWhichShouldOnlyBeDoneAtRunTime(); }

0
2017-07-23 14:35