2009-02-04 30 views

Trả lời

14

WPF không bao gồm System.Windows.Forms tiện dụng. Màn hình lớp học, nhưng bạn vẫn có thể sử dụng các thuộc tính của nó để hoàn thành nhiệm vụ của bạn trong ứng dụng WinForms của bạn.

Giả sử rằng này có nghĩa là cửa sổ WinForms và _wpfWindow là một biến định nghĩa tham khảo sổ WPF trong ví dụ dưới đây (đây sẽ là trong bất cứ mã xử lý bạn thiết lập để mở cửa sổ WPF, giống như một số Button.Click handler):

Screen screen = Screen.FromControl(this); 
_wpfWindow.StartupLocation = System.Windows.WindowStartupLocation.Manual; 
_wpfWindow.Top = screen.Bounds.Top; 
_wpfWindow.Left = screen.Bounds.Left; 
_wpfWindow.Show(); 

Mã trên sẽ khởi chạy cửa sổ WPF ở góc trên bên trái của màn hình chứa cửa sổ WinForms của bạn. Tôi sẽ để lại toán cho bạn nếu bạn muốn đặt nó ở vị trí khác như giữa màn hình hoặc theo kiểu "xếp tầng" bên dưới và bên phải của cửa sổ WinForms.

Một phương pháp mà được các cửa sổ WPF ở giữa màn hình sẽ chỉ cần sử dụng

_wpfWIndow.StartupLocation = System.Windows.WindowStartupLocation.CenterScreen 

Tuy nhiên, đây không phải là khá linh hoạt vì nó sử dụng vị trí của chuột để tìm ra màn hình hiển thị cửa sổ WPF (và rõ ràng là chuột có thể nằm trên màn hình khác với ứng dụng WinForms nếu người dùng di chuyển nhanh hoặc bạn sử dụng nút mặc định hoặc bất kỳ thứ gì).

Chỉnh sửa: Here's a link to an SDK document về cách sử dụng InterOp để cửa sổ WPF của bạn tập trung vào cửa sổ không phải WPF. Nó về cơ bản những gì tôi đã mô tả về mặt toán học, nhưng chính xác cho phép bạn thiết lập thuộc tính "Chủ sở hữu" của WPF Window bằng HWND của Window.

1

Bạn sẽ có thể sử dụng System.Windows.Forms.Screen [1] và sử dụng phương thức FromControl để nhận thông tin màn hình cho biểu mẫu. Sau đó bạn có thể sử dụng điều này để định vị cửa sổ WPF (trên cùng, bên trái) dựa trên màn hình bạn đang cố gắng định vị nó.

[1] Bạn cũng có thể sử dụng win32 MonitorFromRect et al, nếu bạn không tải các dll WinForms. Tuy nhiên, vì bạn đã có API winforms, bạn sẽ không phải trả bất kỳ bộ nhớ/số lần truy cập nào.

6

Đây là cách đơn giản nhất (sử dụng WindowStartupLocation.CenterOwner).

MyDialogWindow dialogWindow = new MyDialogWindow(); 
dialogWindow.Owner = this; 
dialogWindow.WindowStartupLocation = WindowStartupLocation.CenterOwner; 

dialogWindow.ShowDialog(); 

Không cần interop hoặc thiết lập cửa sổ coords :)

3

Một cách khác để làm việc đó là:

WindowInteropHelper helper = new WindowInteropHelper(this); 

this.StartupLocation = System.Windows.WindowStartupLocation.Manual; 
this.Left = System.Windows.Forms.Screen.FromHandle(helper.Handle).Bounds.Left; 
this.Top = System.Windows.Forms.Screen.FromHandle(helper.Handle).Bounds.Top; 

này = Window WPF của bạn ...

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