2012-04-15 32 views
15

MainWindow của tôi cần đăng ký một số sự kiện từ một đối tượng. Đối tượng được khởi tạo trước khi MainWindow được tạo. Tôi muốn truyền đối tượng này tới mainWindow thông qua hàm tạo của nó.Làm cách nào để chỉnh sửa hàm tạo MainWindow của một ứng dụng WPF?

Tuy nhiên tôi không thể tìm ra từ nơi hàm tạo MainWindow được gọi. Ngoài ra, tôi đã cố truyền đối tượng qua chức năng thành viên của MainWindow, nhưng app.MainWindownull trước khi gọi app.Run(). Sau app.Run() được gọi là mã không trả lại cho đến khi chương trình chấm dứt.

Một vị trí khác sẽ lưu trữ đối tượng trong lớp tĩnh và có quyền truy cập MainWindow, nhưng điều này có vẻ phức tạp không cần thiết.

Tôi nhận ra mình chỉ có thể tạo đối tượng trong hàm tạo MainWindow, nhưng điều đó có nghĩa là phải đặt nhiều mã khác ở đó, khá nhiều toàn bộ hàm chính.

Làm cách nào để chuyển đối tượng này vào MainWindow của tôi? Hoặc là hàm tạo MainWindow có chức năng là 'Chính' cho toàn bộ chương trình?

Trả lời

23

Bạn có thể làm điều đó như thế này.

Đầu tiên hãy đi vào App.xaml và xóa dòng này StartupUri="MainWindow.xaml" để ngăn WPF tự động hiển thị MainWindow.

Tiếp theo, nhấp chuột phải vào App.xaml và chọn View Code để mở App.xaml.cs. Bên trong tệp này, chúng ta cần ghi đè sự kiện OnStartup.

protected override void OnStartup(StartupEventArgs e) 
{ 
    base.OnStartup(e); 
} 

Bên trong OnStartup chúng tôi có thể khởi tạo MainWindow và hiển thị nó.

protected override void OnStartup(StartupEventArgs e) 
{ 
    base.OnStartup(e); 

    MainWindow mw = new MainWindow(); 
    mw.Show(); 
} 

Và bây giờ chúng tôi có thể sử dụng để tải thay thế Constructor mà chúng tôi có thể sử dụng để chuyển thêm thông tin.

App.xaml.cs

protected override void OnStartup(StartupEventArgs e) 
{ 
    base.OnStartup(e); 

    MainWindow mw = new MainWindow(5); 
    mw.Show(); 
} 

MainWindow.xaml.cs

public MainWindow() 
{ 
    InitializeComponent(); 
} 

public MainWindow(int number) : base() 
{ 

} 

Tôi thích chainconstructors của tôi, nhưng đó là tất nhiên không phải là một yêu cầu bằng bất kỳ phương tiện.

+0

Cảm ơn bạn, điều này hoạt động như một sự quyến rũ. Tuy nhiên điều này có nghĩa là chức năng 'OnStartup' là khá nhiều' Main', trừ khi bạn phân lớp 'StartupEventArgs' và đặt mọi thứ bạn cần từ' Main' trong đó.Tôi đoán nó không thực sự quan trọng, tôi chỉ được sử dụng để C + +. –

2

Bạn có thể đặt đối tượng làm DataContext của MainWindow bằng cách khai báo nó trong chính XAML. (Ví dụ: nếu bạn đang cố tạo một ViewModel). Ngoài ra, WPF sẽ tạo cá thể theo cách bạn không thể kiểm soát. Bạn có thể đặt mã của riêng bạn trong lớp Ứng dụng để tạo và hiển thị cửa sổ và xóa StartupUri khỏi App.xaml.

+0

Sử dụng 'DataContext' là cách để đi trong WPF, đặc biệt nếu bạn muốn sử dụng các mẫu nâng cao hơn như ví dụ' MVVM' sau. – eandersson

+0

Cảm ơn bạn đã trả lời, tôi sẽ chấp nhận câu trả lời của Fuji vì nó rộng hơn một chút. –

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