2008-10-29 40 views
139

InitializeComponent() làm gì và nó hoạt động như thế nào trong WPF?InitializeComponent() làm gì, và nó hoạt động như thế nào trong WPF?

Nói chung đầu tiên, nhưng tôi đặc biệt quan tâm để biết chi tiết đẫm máu của trật tự xây dựng và điều gì xảy ra khi có Thuộc tính được đính kèm.

+2

Cảm ơn, tôi nghĩ đây là những câu trả lời khá hay dưới đây! Không ai đề cập đến chính xác AttachedProperties, nhưng bây giờ tôi biết rằng bất kỳ AttachedProperties nào trong Xaml vừa được tạo ra như là một phần của phân tích Xaml, vì vậy chúng không thực sự đáng được đề cập đến đặc biệt. –

Trả lời

136

Gọi tới InitializeComponent() (thường được gọi trong hàm dựng mặc định ít nhất WindowUserControl) thực sự là một cuộc gọi phương thức đến lớp một phần của điều khiển (thay vì gọi lên phân cấp đối tượng như tôi đã dự kiến ​​trước) .

Phương pháp này định vị một URI tới XAML cho Window/UserControl đang tải và chuyển nó đến phương thức tĩnh System.Windows.Application.LoadComponent(). LoadComponent() tải tệp XAML được đặt tại thông qua trong URI và chuyển đổi nó thành một thể hiện của đối tượng được chỉ định bởi phần tử gốc của tệp XAML.

Cụ thể hơn, LoadComponent tạo một phiên bản XamlParser và xây dựng một cây XAML. Mỗi nút được phân tích cú pháp theo số XamlParser.ProcessXamlNode(). Điều này được chuyển đến lớp BamlRecordWriter. Một thời gian sau này tôi bị lạc một chút trong cách BAML được chuyển đổi thành đồ vật, nhưng điều này có thể đủ để giúp bạn trên con đường dẫn đến chứng ngộ.

Lưu ý: Điều thú vị là, InitializeComponent là phương thức trên giao diện System.Windows.Markup.IComponentConnector, trong đó Window/UserControl triển khai trong lớp được tạo một phần.

Hy vọng điều này sẽ hữu ích!

+1

BamlRecordWriter là gì? Tôi không thể tìm thấy lớp đó ở bất kỳ đâu ... – flq

+0

@Brad, làm cách nào bạn tìm thấy giao diện InitializeComponent nào được định nghĩa? Trợ giúp F1 trong cuộc gọi trong tệp .xaml.cs dẫn đến "trang không tìm thấy" trong khi tệp .g.cs hoặc .g.i.cs dẫn đến lớp Microsoft.SPOT.Emulator.EmulatorComponent. Tôi mới tham gia WPF. Phương pháp này có được tạo tại thời gian xây dựng không? – Vimes

+0

@ АртёмЦарионов Nếu không có một cuộc gọi đến InitializeComponent trong constructor, điều khiển sẽ không hiển thị hoặc có thể sử dụng trong XAML mà nó nằm. – Jason

20

Việc xem mã luôn hữu ích. Nghĩa là, bạn thực sự có thể có một cái nhìn tại các lớp học phần được tạo ra (mà các cuộc gọi LoadComponent) bằng cách làm như sau:.

  1. Đến cửa sổ Solution Explorer trong dung dịch Visual Studio mà bạn quan tâm ở
  2. Có một nút trong thanh công cụ của Solution Explorer có tiêu đề 'Hiển thị tất cả các tệp'. Chuyển đổi nút đó.
  3. Bây giờ, mở rộng thư mục obj và sau đó là gỡ lỗi hoặc phát hành thư mục (hoặc bất kỳ cấu hình bạn đang xây dựng) và bạn sẽ thấy một file mang tên YourClass .g.cs.

YourClass .g.cs ... là mã dành cho lớp học được tạo ra một phần. Một lần nữa, nếu bạn mở nó lên, bạn có thể thấy phương thức InitializeComponent và cách nó gọi LoadComponent ... và nhiều hơn nữa.

+12

Lưu ý rằng bạn có thể thực hiện việc này trong một bước bằng cách nhấp chuột phải vào cuộc gọi phương thức trong hàm tạo và chọn "Chuyển đến Định nghĩa". –

+1

Ah, đúng vậy ... quên mất điều đó. Dễ dàng hơn nhiều theo cách đó. Vâng, ít nhất bạn biết làm thế nào nó được bao gồm trong dự án. Grin. – cplotts

+1

@Brad Leach, Cuối buổi tiệc này, bạn có thể làm điều đó với F12 –

Các vấn đề liên quan