2012-06-26 5 views
7

Tôi đang sử dụng đoạn mã sau cho tôi:PresentationSource.FromVisual (this) trả về giá trị null trong WPF

protected override void OnSourceInitialized(EventArgs e) 
{ 
... 
.... 
HwndSource source = PresentationSource.FromVisual(this) as HwndSource; 
... 
... 
} 

Trong một số hệ thống "nguồn" giá trị đi ra để được null và tôi không thể tìm ra lý do tại sao ...

Trả lời

7

Tôi nghĩ bạn có thể phải chờ cho đến khi giao diện người dùng được hiển thị cho đến khi bạn cố gắng chỉ định Hwnd. Hãy thử đặt nó trong trình xử lý sự kiện cho Window.Loaded để thay thế.

Điều này đã xảy ra với tôi trước đây, tôi đã gán nhiệm vụ Hwnd sau khi InitializeComponent() được gọi trong hàm tạo của mã-đằng sau. Nó luôn luôn trở lại null, có thể cảm giác khi tôi bước qua và thấy giao diện người dùng chưa xuất hiện. Tôi popped nó vào xử lý _Loaded và thì đấy, giao diện người dùng render trước khi nhấn dòng đó và tất cả 'đột ngột' này đột ngột dừng lại.

3

Câu trả lời của WumpasTamer là chính xác. Tôi chỉ muốn thêm một mẫu mã nhanh cho bất kỳ ai khác tìm kiếm giải pháp "chìa khóa trao tay". Nếu bạn đang sử dụng WPF thì window là không cần thiết, nhưng nếu bạn đang sử dụng Winforms và muốn sử dụng PresentationSource bạn sẽ cần phải sử dụng điều này.

void Main() 
{ 
    var window = new Window 
    { 
     Width = 0, 
     Height = 0, 
     WindowStyle = WindowStyle.None, 
     ShowInTaskbar = false, 
     ShowActivated = false 
    }; 
    window.Loaded += a_Loaded; 
    window.Show(); 
} 

void a_Loaded(object sender, EventArgs e) 
{ 
    var s = (Window) sender; 
    var source = PresentationSource.FromVisual(s); 
    //... 
    s.Close(); 
} 
3

Bắt đầu với Net 4.0, bạn có thể truy cập HwndSource mà không cần phải hiển thị cửa sổ đầu tiên:

var helper = new WindowInteropHelper(this); 
var hwndSource = HwndSource.FromHwnd(helper.EnsureHandle()); 
+0

tôi vẫn nhận được null từ 'PresentationSource.FromVisual' sau khi gọi 'WindowInteropHelper.EnsureHandle'. Có vẻ như tôi thực sự phải hiển thị cửa sổ. 'FromVisual' phải yêu cầu những thứ bên trong khác được tạo ra một cách lười biếng, ngoài tầm tay cầm. –

+0

Tại sao bạn không sử dụng 'HwndSource.FromHwnd' thay thế? –

+0

Vì tôi cần nguồn trình bày để truy cập mục tiêu sáng tác để truy cập ma trận để truy cập các giá trị DPI. –