2009-03-16 14 views
7

tôi thấy một ví dụ mã tạo ra một phương pháp Window_Loaded() được gọi bằng XAML của "Window Loaded" sự kiện:Tại sao phải chạy mã trong phương thức được gọi là XAML Window.Loaded?

<Window x:Class="TestModuleLoader.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300" Loaded="Window_Loaded"> 
    <Grid> 
     ... 
    </Grid> 
</Window> 

Nhưng trong mã phía sau, mã làm việc trong cả các nhà xây dựng và Window_Loaded() phương pháp:

using System.Windows; 

namespace TestModuleLoader 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
     } 

     private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 
      //what advantages do I have running code here? 
     } 
    } 
} 

Có lợi thế nào để thực hiện việc này không?

Có "Chu kỳ tải cửa sổ" như trong ASP.NET đang diễn ra ở đây hữu ích để biết, tức là các phương pháp như PreRender(), PostRender(), v.v ...?

Trả lời

12

Có, có vòng đời tương tự cho các điều khiển WPF, giống như trong ASP.NET. Vòng đời của các điều khiển WPF là đơn giản hơn, vì nó về cơ bản bảo đảm sự kiện khởi tạo, nạp và dỡ (theo thứ tự đó). Xem:

http://msdn.microsoft.com/en-us/library/ms754221.aspx

và Mike Hillberg có một bài báo xuất sắc thể hiện sự khác biệt giữa các sự kiện initalized và nạp:

http://blogs.msdn.com/mikehillberg/archive/2006/09/19/LoadedVsInitialized.aspx

+0

Mike Hillberg nói trong blog của mình "nếu bạn không chắc chắn nên sử dụng sự kiện nào và bạn không muốn đọc thêm bất kỳ sự kiện nào nữa, hãy sử dụng sự kiện được tải". Tuyệt vời, tôi cảm thấy hơi quá tải với WPF vào lúc này và đó là tất cả những gì tôi cần biết bây giờ. Cảm ơn các liên kết! –

+0

WPF có thể cảm thấy một chút áp đảo. Cá nhân tôi cảm thấy như tôi đã chỉ nhìn thấy đỉnh của tảng băng trôi. – Razzie

3

liên kết tuyệt vời, Mâm xôi vàng.

Edward - bạn sẽ thấy rằng sự phân biệt nhất là Contructor luôn là phương pháp đầu tiên được gọi trên Window/Page/UserControl và bạn không thể đếm trên tất cả DependencyProperties đã được khởi tạo cho giá trị cuối cùng của chúng. Ngoài ra, nó bị bệnh nên gọi bất kỳ phương pháp ảo từ bên trong construtructor của bạn.

Sự kiện được tải, ngược lại, thường được gọi ở cuối quá trình khởi tạo ... nghĩa là - khi Cửa sổ/Trang/UserControl đã được tải hoàn toàn vào WPF ElementTree. Từ bên trong sự kiện đã tải của bạn, bạn có thể tự tin gọi bất kỳ phương thức nào và sửa đổi bất kỳ DepenencyProperty nào mà không có rủi ro về kết quả không mong muốn.

Mẫu đẹp (mà tôi hiện đang sử dụng trong dự án của mình) là khởi tạo thuộc tính phụ thuộc tùy chỉnh trong sự kiện được tải nếu chúng chưa được sửa đổi trong khi khởi tạo. Đối với các điều khiển, mẫu này cho phép bạn tránh việc khởi tạo các thuộc tính "đắt tiền" (như DependencyProperty là một ObservableCollection) nếu chúng bị ghi đè (tức là bởi một thuộc tính Binding từ mã gọi).

Câu trả lời đơn giản: Sử dụng sự kiện được tải nếu bạn không chắc chắn về cách tải quá trình xây dựng một cách an toàn.

+0

tóm tắt tốt đẹp :-) – Razzie