Trong ứng dụng WPF của tôi, tôi lưu trữ nội dung Win32 bằng HwndHost. Tuy nhiên, việc tạo một HwndHost không tạo ra cửa sổ gốc. Thay vào đó, điều này được thực hiện trong phương thức BuildWindowCore()
bị ghi đè được WPF gọi một vài lần sau đó.Buộc khởi tạo một HwndHost
Nội dung được lưu trữ của tôi cần xử lý cửa sổ của cửa sổ gốc để khởi tạo riêng. Thật không may, không có cách nào tôi có thể buộc việc tạo ra các cửa sổ (tức là có WPF gọi BuildWindowCore), vì vậy tôi có một thread thứ hai mà thăm dò ý kiến HwndHost cho đến khi nó đã được khởi tạo.
Trong .NET 4.0/WPF 4.0, một phương thức mới WindowInteropHelper.EnsureHandle()
đã được thêm vào. Tôi đã hy vọng điều này sẽ giải quyết tình hình, nhưng nó chỉ hoạt động cho một cửa sổ, không phải là một HwndHost (mà không xuất phát từ cửa sổ). Bạn có một gợi ý những gì tôi có thể làm thay vào đó?
EDIT:
Tôi quên thêm một số khó khăn hơn cho một giải pháp khả thi:
- Các HwndHost được đặt trong một điều khiển mà, tùy thuộc vào thiết lập người dùng, có thể là một đứa trẻ của ứng dụng của chính cửa sổ hoặc có thể được đặt trong một Cửa sổ mới (thông qua trình quản lý ghép nối của bên thứ ba). Điều này có nghĩa là trong quá trình tạo cửa sổ, tôi không biết chắc chắn cửa sổ cha mẹ (và do đó nó sẽ là hWnd).
- Trong khi mã gốc cần hWnd trong quá trình khởi tạo, cửa sổ chỉ được hiển thị khi người dùng yêu cầu hiển thị (tức là lúc đầu vô hình). Cần hiển thị cửa sổ, chỉ để ẩn nó ngay lập tức, nên tránh, nếu có thể.
Có hai vấn đề: 1) Tôi không biết phụ huynh hWnd, vì điều khiển sau đó được trình quản lý docking của bên thứ ba định vị và cài đặt người dùng được lưu trữ xác định xem nó có được hiển thị hay không. con "của cửa sổ chính. 2) Việc kiểm soát với HwndHost có thể không được hiển thị ban đầu (tùy thuộc vào cài đặt người dùng được lưu trữ), nhưng khi khởi động mã kế thừa cần hWnd. –
Bạn sẽ có thể móc vào sự kiện được tải trên điều khiển của bạn và thực hiện tất cả khởi tạo tại đó: http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.loaded.aspx. Nếu mã di sản cần hwnd thì bạn chỉ cần giữ nguyên làm bất cứ điều gì với mã di sản cho đến khi hwnd đã sẵn sàng (đó là những gì tôi phải làm). –
Trích dẫn từ liên kết: "Xảy ra khi phần tử được đặt ra, được hiển thị và sẵn sàng cho tương tác". Nếu tôi không hiển thị điều khiển, Đã tải sẽ không kích hoạt. –