การควบคุมการวัดด้วย double.PositiveInfinity WPF

ฉันกำลังทำงานกับการควบคุมแบบกำหนดเองที่มีพาเนลแบบกำหนดเอง และภายในพาเนลแบบกำหนดเอง ฉันมีเมธอด MeasureOverride ขนาดเล็กและเรียบง่ายที่ส่งขนาด double.PositiveInfinity ไปยังเมธอดลูก MeasureOverride แผงแบบกำหนดเองควรดูแลเค้าโครง และควรทำให้ลูกใหญ่ขึ้นหรือเล็กลง ขึ้นอยู่กับขนาดหน้าต่าง

หากคุณจัดการกับการควบคุมแล้ว คุณควรรู้ว่าระบบเค้าโครง wpf ทำงานอย่างไร และโดยพื้นฐานแล้วเด็กทุกคนจะเรียก MeasureOverride ซึ่งเรียก MeasureOverride ของลูกของ childs และอื่นๆ

ตอนนี้ปัญหาคือเมื่อฉันปรับขนาดหน้าต่าง แผงแบบกำหนดเองจะได้รับแฟล็กเพื่อทำการวัดอีกครั้ง ดังนั้น MeasureOverride จึงถูกเรียกอีกครั้ง แต่คราวนี้ในขณะที่ส่งขนาด double.PositiveInfitinty ไปยังลูก ๆ ของมัน ลูก ๆ MeasureOverride จะไม่ได้รับ เรียกว่าเลย (แต่ควรเรียกเมธอดตามคำจำกัดความของระบบโครงร่าง WPF) เหตุผลที่เป็นเช่นนั้น? ฉันคิดเสมอว่าเมื่อฉันเรียก MeasureOverride กับผู้ปกครองว่าลูก ๆ จะถูกบังคับให้ทำการวัดด้วย

แน่นอนว่าฉันผิด ดังนั้นใครก็ได้ช่วยอธิบายฉันหน่อยว่าผู้ควบคุม/เด็กรู้ได้อย่างไรว่าเมื่อใดควรวัดอีกครั้ง

ยังไงก็ตาม ฉันกำลังส่งขนาด double.PositiveInfinity ไปให้เด็กๆ เพื่อบอกให้พวกเขาใช้พื้นที่ให้มากที่สุดเท่าที่จำเป็น

รหัส:

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

รหัสเป็นเรื่องง่าย ฉันไม่เข้าใจว่าทำไมเด็กๆ ถึงไม่วัดอีกครั้ง และขออภัยหากฉันสะกดรหัสบางอย่างผิด


person cyberist    schedule 08.02.2013    source แหล่งที่มา
comment
โปรดแสดงรหัสของคุณสำหรับวิธี MeasureOverride ของแผงที่คุณกำหนดเอง   -  person Benjamin Gale    schedule 08.02.2013


คำตอบ (2)


ลูกของคุณจะไม่ถูกวัดอีกครั้งเพราะพวกเขาไม่จำเป็นต้อง: เนื่องจากคุณเอาแต่วัดขนาดเดิม WPF จึงรู้ว่าไม่มีเหตุผลที่จะต้องวัดอีกครั้งเนื่องจากผลลัพธ์ DesiredSize จะเหมือนเดิม

ดังที่กล่าวไว้ Desiredsize อัปเดตโดย Measure เป็นเพียงขนาดที่บุตรหลานของคุณเห็นว่าเหมาะสมที่สุดเท่านั้น คุณ ควร คำนึงถึงเรื่องนี้เมื่อแทนที่ ArrangeOverride แต่คุณไม่จำเป็นต้อง: เพียงจัดลูก ๆ ของคุณในแบบที่คุณต้องการ การที่ MeasureOverride ถูกเรียกหรือไม่สำหรับลูก ๆ ของคุณก็ไม่น่าจะเกี่ยวข้อง

person Julien Lebosquain    schedule 08.02.2013
comment
นั่นหมายความว่าพวกเขาจะไม่ถูกวัดอีกครั้งเนื่องจากฉันจะผ่านมันไปเป็นสองเท่าเสมอ PositiveInfinity? ต้องเรียกไปวัด เมื่อหน้าต่างเปลี่ยนขนาด เด็กแต่ละคนจะต้องถูกวัด เนื่องจากเด็กมีลอจิกการวัดเฉพาะ - person cyberist; 08.02.2013
comment
จากนั้นคุณควรวัดองค์ประกอบด้วยข้อจำกัดที่กำหนด หรือคุณจำเป็นต้องแจ้งองค์ประกอบเกี่ยวกับการเปลี่ยนแปลงขนาดและทำให้การวัดเป็นโมฆะ โปรดทราบว่าการทำให้การวัดเป็นโมฆะจะทำให้องค์ประกอบนั้นสกปรกและไม่ใช่ลูกหลานหรือบรรพบุรุษของมัน ดังนั้นหากคุณอาศัย DesiredSize ในการเปลี่ยนแปลง คุณจะต้องเดินขึ้นไปบนแผนผังองค์ประกอบและทำให้การวัดทั้งหมดเป็นโมฆะจนถึงของคุณ แผงซึ่งทำให้การมีเพศสัมพันธ์ค่อนข้างแน่นระหว่างเด็กเหล่านั้นกับแผง - person AndrewS; 08.02.2013
comment
สมมติว่าพาเนลของฉันมีขนาด 300x300 จากนั้นฉันเปลี่ยนขนาดความกว้างของลูกหนึ่งคนเป็น 400 ฉันจะบอกให้พาเนลของฉันทำให้พาเนลใช้ไม่ได้ได้อย่างไรหาก with of child > 300 ในกรณีนี้ - person cyberist; 09.02.2013
comment
@AndrewS คุณช่วยฉันบอกผู้ปกครองให้พอดีกับขนาดของเด็กได้ไหม? - person cyberist; 09.02.2013
comment
@cyberist: คุณพยายามทำอะไรให้สำเร็จจริงๆ? อย่าผ่าน PositiveInfinity หากลูกของคุณต้องถูกจำกัดด้วยขนาดที่กำหนด: ให้ผ่านขนาดที่มีอยู่แล้วลูกของคุณจะได้รับการวัดอีกครั้ง - person Julien Lebosquain; 09.02.2013
comment
ฉันเรียกใช้การวัดการอัปเดตกับเด็กคนใดก็ได้ และฉันต้องการให้ผู้ปกครองวัดอีกครั้งด้วย - person cyberist; 09.02.2013
comment
@cyberist เด็กไม่ได้บอกผู้ปกครองว่าควรปรับขนาด / วัด / จัดเรียงอย่างไร ผู้ปกครองจะวัดเด็กด้วยข้อจำกัดบางอย่าง - โดยทั่วไปจะเป็นค่าอนันต์หรือด้วยข้อจำกัดบางส่วนที่ได้รับ โดยทั่วไปแล้วผู้ปกครอง (แต่ไม่เสมอไป) จะใช้ DesiredSize ขององค์ประกอบนั้นเมื่อจัดเรียง หากมีสิ่งใดเกิดขึ้นที่ทำให้การวัดของเด็กคนนั้นเป็นโมฆะในภายหลัง ก็จะถูกวัดด้วยข้อจำกัดเดียวกันกับที่วัดครั้งสุดท้าย หากสิ่งที่ส่งกลับแตกต่างจากครั้งล่าสุด ดังนั้น OnDesiredSizeChanged ของพาเรนต์จะถูกเรียกและหน่วยวัดจะไม่ถูกต้อง - person AndrewS; 11.02.2013
comment
นั่นอาจหมายความว่าองค์ประกอบนั้นจะส่งกลับขนาดที่แตกต่างกันสำหรับ DesiredSize ดังนั้นองค์ประกอบหลักจึงอาจใช้ไม่ได้ และมันจะขึ้นไปบนต้นไม้เว้นแต่จะหยุดระหว่างทาง - person AndrewS; 11.02.2013
comment
ผู้ปกครองรู้ได้อย่างไรว่าเมื่อใดที่ลูก desizeSize มีการเปลี่ยนแปลง - person cyberist; 11.02.2013

คุณได้ลองโทรหา UIElement.InvalidateMeasure โดยที่ UIElement คือแผงหลักของคุณใช่ไหม

person sacha barber    schedule 08.02.2013