2014-10-16 19 views
8

Tôi có một điều khiển người dùng WPF như thế này ...mở cửa sổ điều khiển người dùng WPF Winform co mẹ Winform cửa sổ

namespace WpfApplication1 
{ 
    public partial class MyControl : UserControl 
    { 
    ...... 
    } 
} 

Tôi cũng có một hình thức chiến thắng để chứa điều khiển người dùng WPF này ...

namespace WindowsFormsApplication4 
{ 
public partial class Form1 : Form 
{ 

    public Form1() 
    { 

     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     ElementHost ctrlHost = new ElementHost(); 
     ctrlHost.Dock = DockStyle.Fill; 
     WpfApplication1.MyControl win = new WpfApplication1.MyControl(); 
     ctrlHost.Child = win; 
     this.Controls.Add(ctrlHost); 
    } 
} 
} 

tôi có một hình thức chiến thắng hơn cha mẹ mà có một nút. Nhấp vào nút sẽ mở Form1 chứa ElementHost.

namespace WindowsFormsApplication4 
{ 
    public partial class Parent : Form 
    { 
     public Parent() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Form1 form1 = new Form1(); 
      form1.Show(); 

     } 
    } 
} 

ứng dụng của tôi chạy theo hình thức chuyên theo mặc định ...

Application.Run(new Parent()); 

Vấn đề tôi đang phải đối mặt là lạ. Khi tôi chạy ứng dụng, biểu mẫu cha mẹ mở ra và khi nhấn vào nút, biểu mẫu cửa sổ con chứa điều khiển WPF cũng sẽ mở ra. Nhưng vấn đề là kích thước cửa sổ biểu mẫu cha mẹ tự động co lại (cửa sổ thay đổi, phục hồi chính nó và các điều khiển và phông chữ trở nên nhỏ hơn trong đó.) Ngay khi biểu mẫu điều khiển WPF bật lên. Nếu tôi nhận xét nội dung của hàm 'Form1_Load' thì cửa sổ cha sẽ không co lại. Để kiểm tra trường hợp xấu nhất tôi đã nhận xét mọi thứ trong 'Form1_Load' ngoại trừ

ElementHost ctrlHost = new ElementHost(); 

. Sự hiện diện duy nhất của dòng này chính nó làm cho hình thức cha mẹ thu nhỏ như tôi đã đề cập trước đó. Tôi đã cố gắng tìm kiếm trên internet cho vấn đề này một cách rộng rãi. Tôi không thể tìm ra giải pháp. Xin hãy giúp tôi với một câu trả lời. Tôi đang cạn kiệt ....

+0

http://www.codeproject.com/Tips/130414/Host-Windows-Form-Controls-in-WPF hãy nhìn vào liên kết này, tôi nghĩ rằng vui lòng cung cấp hình thức cửa sổ của bạn cụ thể chiều rộng và chiều cao và sau đó đã cố gắng để tải kiểm soát người dùng con của bạn. Do trẻ em thêm nội dung được thêm vào biểu mẫu của bạn và nó đến để biết rằng nó đòi hỏi nhiều không gian hơn, đó là lý do tại sao nó co lại. –

+0

cảm ơn ý kiến ​​của bạn Ashok. Tôi đã thử đặt chiều rộng và chiều cao cho cửa sổ chính. Nhưng vẫn còn cùng một vấn đề tồn tại ... – balaji

+0

Bất kỳ tiến bộ nào về điều này? Tôi có chung vấn đề đó. – user958578

Trả lời

7

tôi nhận xét trên mà tôi đã cùng một vấn đề và từ đó giải quyết nó. Tôi đang viết những thay đổi của tôi ở đây cho bất kỳ ai khác. Như đã quan sát ở trên, hành vi dường như xảy ra bất cứ khi nào sử dụng Windows UI mở rộng trong một ứng dụng WinForms và trình biên dịch Just In Time (JIT) xử lý bất kỳ thứ gì từ các thư viện WPF. Trong trường hợp của tôi, nhập một phương thức có chứa mã mở phiên bản WPF của MessageBox sẽ làm cho nó xảy ra. Thông thường Windows sẽ xử lý việc mở rộng quy mô cơ bản cho bạn, hiển thị trên màn hình bitmap offscreen và sau đó vẽ nó trên màn hình nhưng tăng kích thước. Khi WPF tải nó dường như để tiếp nhận, như thể nó nói với Windows, "Hey .. tôi đã nhận này ..". Sau đó Windows ngừng mở rộng quy mô WinForms cho bạn và bạn kết thúc với phiên bản quy mô 1x và thường là một số điều khiển nhầm lẫn. Tuy nhiên, phần WPF đang xử lý quy mô riêng của nó và có vẻ tốt.

Vì vậy, cách tôi đã đi về giải quyết nó là để nói với Windows rằng tôi sẽ xử lý quy mô WinForms. Để kích hoạt tính năng mà bạn có để thêm video này biểu hiện ứng dụng của bạn (dll manifest bị bỏ qua)

<asmv3:application> 
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> 
    <dpiAware>true</dpiAware> 
    </asmv3:windowsSettings> 
</asmv3:application> 

HOẶC bỏ ghi chú phần sau nếu nó là đã có trong đó:

<application xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <windowsSettings> 
    <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware> 
    </windowsSettings> 
</application> 

Bạn có thể thêm một file manifest :

Right click on application project -> Add -> New item... -> Application Manifest File

Sau đó, trong ...

Application Project -> Properties -> Application -> Resources

Hãy chắc chắn rằng "Manifest" được thiết lập để app.manifest

Bây giờ bạn có thể tìm thấy tập tin đó và thêm XML trên vào <asmv1:assembly> phần tử gốc.

Nếu bạn đã thực hiện các ứng dụng mặc định hiển nhiên và bổ sung yếu tố đó nó có thể trông giống như sau

<?xml version="1.0" encoding="utf-8"?> 
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
    <security> 
     <applicationRequestMinimum> 
     <defaultAssemblyRequest permissionSetReference="Custom" /> 
     <PermissionSet class="System.Security.PermissionSet" version="1" Unrestricted="true" ID="Custom" SameSite="site" /> 
     </applicationRequestMinimum> 
    </security> 
    </trustInfo> 
    <asmv3:application> 
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> 
     <dpiAware>true</dpiAware> 
    </asmv3:windowsSettings> 
    </asmv3:application> 
</asmv1:assembly> 

Bây giờ khi bạn bắt đầu WinForms của bạn ứng dụng bạn sẽ thấy đó là crisper nhiều bởi vì nó đang được trả lại tại dpi cao thay vì 96dpi và sau đó thu nhỏ để lấp đầy không gian.

Có thể bạn sẽ nhận thấy rằng rất nhiều hình ảnh của bạn đã bị thu hẹp !! Trong trường hợp của tôi, các nút, MenuStripItems và ToolStripItems không mở rộng như mong muốn.

gì tôi thấy được rằng hầu hết các điều khiển có một phương pháp mà bạn có thể ghi đè như sau

protected override void ScaleControl(SizeF factor, BoundsSpecified specified) 
{ 
    base.ScaleControl(factor, specified); 
} 

này được gọi khi ra mắt ứng dụng và các bộ lọc thông qua điều khiển của bạn từ hình thức chính. Windows của tôi được đặt thành 200%, chế độ mở rộng của biểu mẫu chính được đặt thành DPI và tất cả các biểu mẫu được thiết kế ở tỷ lệ 100% (96dpi). Tôi đã thay đổi mọi thứ trong nỗ lực đầu tiên của mình để khắc phục vấn đề kế thừa chế độ mở rộng và đây là những gì đã làm việc cho tôi, nếu bạn đang sử dụng phông chữ hoặc không ai nghi ngờ nó sẽ hoạt động giống nhau nhưng tôi chưa thử.

Như tôi đã 200% UI rộng khi phương pháp này được gọi là factor chỉ đơn giản là {2,0, 2,0} mà tôi sử dụng để tái tạo một quy mô Image trong Button s, và để tăng ImageScalingSize trên mỗi Items của MenuStripToolStrip vì chúng không nhận được cuộc gọi ScaleControl. Nếu bạn chưa bao giờ thêm XML ở trên thì phương thức này vẫn được gọi nhưng sẽ chỉ có {1.0, 1.0} cho yếu tố, điều này không hữu ích. Lưu ý: nếu bạn đang sử dụng danh sách hình ảnh thì không tự động đặt hình ảnh nếu trong DesignMode hoặc ImageList sẽ không được đặt và khi bạn lưu thì không có gì sẽ được đặt

Cũng không phải yếu tố đó là yếu tố . Những gì bạn sẽ thấy là nếu bạn di chuyển ứng dụng giữa các màn hình dpi khác nhau, bạn sẽ nhận được 2.0, sau đó là 0.5, sau đó là 2.0, sau đó 0.5, v.v.

Ứng dụng WinForms của tôi trông siêu sắc nét và có thể gọi các phần tử WPF ui mà không cần khùng! yyayyyyy

Hy vọng điều này sẽ giúp người

+0

Cảm ơn rất nhiều! Trong trường hợp của tôi, tôi đã phải tắt nó để thực sự cho phép các cửa sổ xử lý tất cả các tỉ lệ :) – Jerther

+0

Cảm ơn. Nó rất hữu ích. –

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