Ukur Kontrol dengan double.PositiveInfinity WPF

Saya sedang mengerjakan kontrol khusus yang memiliki panel khusus dan di dalam panel khusus saya memiliki metode MeasureOverride kecil dan sederhana yang meneruskan ukuran double.PositiveInfinity ke metode MeasureOverride turunannya. Panel khusus harus mengatur tata letaknya dan harus membuat anak-anak lebih besar atau lebih kecil tergantung pada ukuran jendela.

Jika Anda telah berurusan dengan kontrol, Anda harus mengetahui cara kerja sistem tata letak wpf dan bahwa pada dasarnya setiap anak memanggil MeasureOverride yang memanggil MeasureOverride anak-anak anak-anak dan seterusnya.

Sekarang masalahnya adalah ketika saya mengubah ukuran jendela, panel khusus menerima tanda untuk melakukan pengukuran lagi sehingga MeasureOverride dipanggil lagi tetapi kali ini ketika meneruskan ukuran double.PositiveInfitinty ke anak-anaknya, anak-anak MeasureOverride tidak mendapatkan dipanggil sama sekali (tetapi metode ini harus dipanggil sesuai dengan definisi sistem tata letak WPF). Mengapa demikian? Saya selalu berpikir ketika saya menelepon MeasureOverride pada orang tua bahwa anak-anaknya juga akan dipaksa untuk melakukan tindakan tersebut.

Jelas saya salah, jadi bisakah seseorang menjelaskan kepada saya bagaimana seorang kontrol/anak mengetahui kapan harus mengukur lagi?

Ngomong-ngomong, saya memberikan ukuran double.PositiveInfinity kepada anak-anak untuk memberitahu mereka agar mengambil ruang sebanyak yang diperlukan.

Kode:

protected override Size MeasureOverride(Size availableSize)
{
 double x;
 double y;
 var children = this.InternalChildren;
 for (int i = 0; i < children.Count; i++)
     {
       UIElement child = children[i];
       child.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity);
       y += child.DesiredSize.Height;
       x = Math.Max(x, child.DesiredSize.Width);
      }
 return new Size(x, y);
}

Kode itu sederhana. Saya tidak mengerti mengapa anak-anak tidak diukur lagi. Dan maaf jika saya salah mengeja sesuatu dalam kode.


person cyberist    schedule 08.02.2013    source sumber
comment
Harap tunjukkan kepada kami kode Anda untuk metode MeasureOverride panel khusus Anda.   -  person Benjamin Gale    schedule 08.02.2013


Jawaban (2)


Anak-anak Anda tidak akan diukur lagi karena mereka tidak perlu melakukannya: karena Anda terus memberikan ukuran yang sama, WPF tahu bahwa tidak ada alasan untuk mengukur lagi karena DesiredSize yang dihasilkan akan sama.

Meskipun demikian, Desiredsize yang diperbarui oleh Measure hanyalah ukuran yang dianggap paling sesuai oleh anak Anda. Anda harus mempertimbangkannya saat mengganti ArrangeOverride, namun Anda tidak berkewajiban untuk: cukup mengatur anak-anak Anda sesuai keinginan Anda, fakta bahwa MeasureOverride dipanggil atau tidak untuk anak-anak Anda seharusnya tidak relevan.

person Julien Lebosquain    schedule 08.02.2013
comment
Apakah itu berarti nilai tersebut tidak akan pernah diukur lagi karena saya akan selalu memberikannya double.PositiveInfinity? Saya perlu memanggil mereka untuk mengukur. Ketika jendela telah berubah ukurannya, setiap anak perlu diukur karena anak tersebut memiliki logika ukuran tertentu. - person cyberist; 08.02.2013
comment
Maka Anda harus mengukur elemen dengan batasan yang diberikan atau Anda perlu memberi tahu elemen tentang perubahan ukuran dan membuat ukurannya tidak valid. Tentu saja perhatikan bahwa membatalkan ukuran hanya akan mengotori elemen itu dan bukan keturunan atau leluhurnya, jadi jika Anda mengandalkan DesiredSize untuk mengubahnya maka Anda harus menaiki pohon elemen dan membatalkan semua ukuran hingga Anda panel yang membuat sambungan cukup erat antara anak-anak tersebut dan panel. - person AndrewS; 08.02.2013
comment
katakanlah panel saya memiliki 300x300 dan kemudian saya mengubah ukuran lebar satu anak menjadi 400. bagaimana saya bisa memberitahu panel saya untuk membuat panel tidak valid jika dengan anak › 300 seperti dalam kasus ini? - person cyberist; 09.02.2013
comment
@AndrewS, bisakah Anda membantu saya bagaimana cara memberi tahu orang tua agar sesuai dengan ukuran anak? - person cyberist; 09.02.2013
comment
@cyberist: Apa yang sebenarnya ingin Anda capai? Jangan berikan PositiveInfinity jika anak Anda harus dibatasi pada ukuran tertentu: lewati ukuran yang tersedia dan anak Anda akan diukur lagi. - person Julien Lebosquain; 09.02.2013
comment
Saya memicu tindakan pembaruan pada anak mana pun dan saya ingin orang tua juga melakukan tindakan lagi. - person cyberist; 09.02.2013
comment
@cyberist Seorang anak tidak memberi tahu orang tuanya bagaimana seharusnya mengukur/mengukur/mengaturnya. Orang tua akan mengukur anaknya dengan beberapa batasan - biasanya dengan tak terhingga atau dengan sebagian batasan yang diberikan. Induk kemudian biasanya (tetapi tidak selalu) menggunakan DesiredSize elemen tersebut saat mengaturnya. Jika terjadi sesuatu yang membuat pengukuran anak tersebut tidak valid, maka pengukuran tersebut akan diukur kembali dengan batasan yang sama seperti yang diukur sebelumnya. Jika yang dikembalikannya berbeda dari sebelumnya, maka OnDesiredSizeChanged induknya dipanggil dan ukurannya menjadi tidak valid. - person AndrewS; 11.02.2013
comment
Itu mungkin berarti bahwa elemen tersebut akan mengembalikan ukuran yang berbeda untuk DesiredSize-nya sehingga induknya mungkin menjadi tidak valid. Dan ia terus naik ke atas pohon kecuali ia berhenti di sepanjang jalan. - person AndrewS; 11.02.2013
comment
Bagaimana orang tua mengetahui kapan desizeSize anak diubah? - person cyberist; 11.02.2013

Sudahkah Anda mencoba menelepon UIElement.InvalidateMeasure di mana UIElement adalah panel induk Anda?

person sacha barber    schedule 08.02.2013