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


166

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

Nói chung, nhưng tôi đặc biệt muốn biết các chi tiết cơ bản về trật tự xây dựng, và điều gì xảy ra khi có Thuộc tính đí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 chính xác các Đính kèm đính kèm, nhưng bây giờ tôi biết rằng mọi Phần đính kèm trong Xaml chỉ được tạo như một phần của phân tích cú pháp Xaml, vì vậy chúng không thực sự đáng được đề cập đặc biệt.
Tim Lovell-Smith

Câu trả lời:


157

Cuộc gọi đến InitializeComponent()(thường được gọi trong hàm tạo mặc định của í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 (chứ không phải là gọi lên hệ thống phân cấp đối tượng như tôi dự kiến ​​trước tiên).

Phương thức này định vị một URI cho XAML cho Window/ UserControlđang tải và chuyển nó sang System.Windows.Application.LoadComponent()phương thức tĩnh. LoadComponent()tải tệp XAML được đặt ở vị trí được truyền 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.

Chi tiết hơn, LoadComponenttạo một thể hiện của XamlParservà xây dựng một cây XAML. Mỗi nút được phân tích cú pháp bởi XamlParser.ProcessXamlNode(). Điều này được truyền cho BamlRecordWriterlớp. Một thời gian sau, tôi có một chút lạc lõng về cách BAML được chuyển đổi thành các đối tượng, nhưng điều này có thể đủ để giúp bạn trên con đường dẫn đến giác ngộ.

Lưu ý: Thật thú vị, đây InitializeComponentlà một phương thức trên System.Windows.Markup.IComponentConnectorgiao diện, trong đó Window/ UserControlhiện thực trong lớp được tạo một phần.

Hi vọng điêu nay co ich!


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

@ Рррррррррррррр nếu không có lệnh gọi LaunchizeComponent trong hàm tạo, điều khiển sẽ không hiển thị hoặc có thể sử dụng được trong XAML mà nó được đặt.
Jason

Hấp dẫn. Tôi có ấn tượng rằng xaml chỉ được sử dụng trong quá trình biên dịch .. Điểm nào để có xaml có sẵn trong thời gian chạy và nó được lưu trữ ở đâu?
Jesper Matthiesen

Tại sao một số phương thức cung cấp cho tôi "tham chiếu đối tượng không được đặt trên một thể hiện của đối tượng." ?
Peter Gruppelaar

26

Nhìn vào mã luôn giúp quá. Đó là, bạn thực sự có thể xem lớp một phần được tạo (gọi LoadComponent ) bằng cách thực hiện như sau:

  1. Chuyển đến ngăn Solution Explorer trong giải pháp 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à thư mục Gỡ lỗi hoặc Phát hành (hoặc bất kỳ cấu hình nào bạn đang xây dựng) và bạn sẽ thấy một tệp có tiêu đề YourClass .g.cs.

Các YourClass .g.cs ... là mã cho lớp một phần tạo ra. 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 lệnh gọi phương thức trong hàm tạo và chọn "Chuyển đến Định nghĩa".
Brad Leach

2
À, đúng rồi ... quên mất chuyện đó. Cách đó dễ dàng hơn nhiều. Vâng, ít nhất bạn biết làm thế nào nó được bao gồm trong dự án. Cười toe toét.
cplotts

1
@Brad Leach, Đến bữa tiệc muộn này, bạn có thể làm điều đó với F12
Julius Depulla
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.