InitializeComponent () ทำอะไรได้บ้างและทำงานอย่างไรใน WPF


166

สิ่งที่ไม่InitializeComponent()ทำและวิธีการที่ไม่ได้ทำงานใน WPF?

โดยทั่วไปก่อนอื่น แต่โดยเฉพาะอย่างยิ่งฉันจะสนใจที่จะรู้รายละเอียดเต็มไปด้วยเลือดของคำสั่งของการก่อสร้างและสิ่งที่จะเกิดขึ้นเมื่อมีคุณสมบัติที่แนบมา


2
ขอบคุณฉันคิดว่านี่เป็นคำตอบที่ดีด้านล่าง! ไม่มีใครพูดถึง AttachedProperties แต่ตอนนี้ฉันรู้แล้วว่า AttachedProperties ใด ๆ ใน Xaml ถูกสร้างขึ้นเป็นส่วนหนึ่งของการแยกวิเคราะห์ Xaml ดังนั้นพวกเขาจึงไม่สมควรได้รับการกล่าวถึงเป็นพิเศษ
Tim Lovell-Smith

คำตอบ:


157

การเรียกไปที่InitializeComponent()(ซึ่งโดยปกติจะเรียกในตัวสร้างเริ่มต้นอย่างน้อยWindowและUserControl) จริง ๆ แล้วเป็นวิธีการโทรไปที่คลาสบางส่วนของการควบคุม (แทนที่จะเรียกลำดับชั้นของวัตถุตามที่ฉันคาดไว้ครั้งแรก)

เมธอดนี้หาตำแหน่ง URI ไปที่ XAML สำหรับWindow/ UserControlที่กำลังโหลดและส่งผ่านไปยังSystem.Windows.Application.LoadComponent()เมธอดสแตติก LoadComponent()โหลดไฟล์ XAML ที่อยู่ที่ผ่านไปใน URI และแปลงเป็นอินสแตนซ์ของวัตถุที่ระบุโดยองค์ประกอบหลักของไฟล์ XAML

ในรายละเอียดเพิ่มเติมLoadComponentสร้างตัวอย่างของXamlParserและสร้างต้นไม้ของ XAML XamlParser.ProcessXamlNode()แต่ละโหนดจะแยกกันโดย สิ่งนี้จะถูกส่งผ่านไปยังBamlRecordWriterชั้นเรียน หลังจากนี้สักครู่ฉันก็หลงทางว่า BAML ถูกเปลี่ยนเป็นวัตถุอย่างไร แต่มันอาจจะเพียงพอที่จะช่วยคุณในเส้นทางสู่การรู้แจ้ง

หมายเหตุ: ที่น่าสนใจInitializeComponentคือวิธีการบนSystem.Windows.Markup.IComponentConnectorอินเตอร์เฟสซึ่งWindow/ UserControlนำไปใช้ในคลาสที่สร้างขึ้นบางส่วน

หวังว่านี่จะช่วยได้!


@Brad คุณทราบได้อย่างไรว่าอินเทอร์เฟซ InitializeComponent ถูกกำหนดไว้อย่างไร วิธีใช้ F1 ในการโทรในไฟล์. xaml.cs นำไปสู่การ "ไม่พบเพจ" ในขณะที่อยู่ในไฟล์. g.cs หรือ. gics นำไปสู่คลาส Microsoft.SPOT.Emulator.EmulatorComponent ฉันใหม่สำหรับ WPF วิธีนี้ถูกสร้างขึ้นที่เวลาที่สร้าง?
Vimes

@ АртёмЦарионовหากไม่มีการเรียก InitializeComponent ใน Constructor ตัวควบคุมจะไม่แสดงหรือใช้งานได้ใน XAML ที่ตั้งอยู่
เจสัน

น่าสนใจ ฉันรู้สึกว่า xaml ถูกใช้ระหว่างการคอมไพล์เท่านั้น ... อะไรคือจุดที่ทำให้ xaml ใช้งานได้ตอนรันไทม์และมันถูกเก็บไว้ที่ไหน?
Jesper Matthiesen

ทำไมบางวิธีทำให้ฉัน "ไม่ได้ตั้งค่าการอ้างอิงวัตถุบนอินสแตนซ์ของวัตถุ" ?
Peter Gruppelaar

26

การดูรหัสก็ช่วยได้เช่นกัน นั่นคือคุณสามารถดูคลาสที่สร้างขึ้นบางส่วน (ที่เรียกLoadComponent ) โดยทำสิ่งต่อไปนี้:

  1. ไปที่บานหน้าต่างโซลูชัน Explorer ในโซลูชัน Visual Studio ที่คุณสนใจ
  2. มีปุ่มในแถบเครื่องมือของ Explorer โซลูชันที่ชื่อว่า 'แสดงไฟล์ทั้งหมด' สลับปุ่มนั้น
  3. ตอนนี้ขยายโฟลเดอร์objแล้วโฟลเดอร์DebugหรือRelease (หรือการกำหนดค่าใด ๆ ที่คุณกำลังสร้าง) และคุณจะเห็นไฟล์ชื่อYourClass .g.cs

YourClass .g.cs ... เป็นรหัสสำหรับการเรียนบางส่วนที่สร้างขึ้น อีกครั้งถ้าคุณเปิดขึ้นคุณสามารถดูวิธีการ InitializeComponent และวิธีที่มันเรียก LoadComponent ... และอีกมากมาย


12
โปรดทราบว่าคุณสามารถทำได้ในขั้นตอนเดียวโดยคลิกขวาที่การเรียกใช้เมธอดในตัวสร้างและเลือก "ไปที่การกำหนด"
แบรดกรอง

2
อ่าใช่แล้ว ... ลืมไปเลย วิธีนั้นง่ายกว่ามาก อย่างน้อยคุณก็รู้ว่ามันรวมอยู่ในโครงการอย่างไร การยิ้มกว้าง
cplotts

1
@Brad Leach, ไปงานเลี้ยงสายนี้, คุณสามารถทำได้กับ F12
Julius Depulla
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.