2012-12-11 20 views
5

Kịch bản

tôi đã kịch bản sau đây (tôi đã lột nó xuống một ứng dụng mẫu):Tạo biểu mẫu từ một WinForms kiểm soát lưu trữ trong WPF - Chủ đầu tư không được thiết lập

  • Một WPF ứng dụng có cửa sổ (MainWindow) lưu trữ một WinForms UserControl (UserControl1).
    • Việc kiểm soát được thêm tự động trong các mã sau vào một WindowsFormsHost
  • UserControl1 có một nút mở ra một hình thức (Form1)
    • Nó sử dụng form1.Show(this).

Vấn đề là: .Owner tài sản

  • Form1 's là null.
    • Trong ứng dụng thực tế, một số công việc được thực hiện liên quan đến tài sản .Owner có nghĩa là tôi không thể bỏ qua vấn đề này. Lý tưởng nhất, tất nhiên, sẽ không có bất kỳ sự phụ thuộc nào ở đây.
    • Trong ứng dụng thực, tôi không có quyền kiểm soát phía WinForms của mã này. Ứng dụng WPF của chúng tôi đang lưu trữ kiểm soát WinForms của một nhóm khác.
    • Lưu ý:
      • Khi tôi sử dụng máy chủ WinForms thay thế, thuộc tính .Owner được đặt chính xác.
      • UserControl1 được lưu trữ tốt theo mọi cách khác - trong ứng dụng thực, mọi thứ khác hoạt động tốt, chỉ cần biểu mẫu mở bởi điều khiển người dùng không có chủ sở hữu phù hợp.

tôi có thể hiểu tại sao có một vấn đề ở đây, nhưng tôi hy vọng câu trả lời cho câu hỏi tiếp theo của tôi có thể là 'yes'!

Tôi có thể làm gì để làm việc này bằng cách thực hiện các thay đổi ở phía WPF của phương trình?

Không làm được điều đó, có thể làm gì ở bên WinForms không? (Nó không vượt ra ngoài cõi của khả năng mà tôi có thể nhận được một số thay đổi được thực hiện có ...)

Mẫu Mã

Dưới đây là đoạn code trong ứng dụng mẫu của tôi. Đầu phía WPF:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:my="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="700"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <Button Name="btnAdd" Click="btnAdd_Click" Content="Add Winform"/> 

     <WindowsFormsHost Grid.Row="1" Name="host" ScrollViewer.CanContentScroll="False"/> 
    </Grid> 
</Window> 
public partial class MainWindow : Window 
{ 
    private WindowsFormsHost host; 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void btnAdd_Click(object sender, RoutedEventArgs e) 
    { 
     UserControl1 uc1 = new UserControl1(); 
     WindowsFormsHost.EnableWindowsFormsInterop(); 
     this.host.Child = uc1; 

    } 
} 

Và bây giờ là WinForms bên ...

UserControl1 chỉ là điều khiển người dùng có nút và nhãn trên đó. Đây là mã:

public partial class UserControl1 : UserControl 
    { 
     public UserControl1() 
     { 
      InitializeComponent(); 
     } 

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

     protected override void OnLoad(EventArgs e) 
     { 
      base.OnLoad(e); 

      this.label1.Text = "this: " + this + Environment.NewLine + "parent: " + this.Parent + Environment.NewLine + "toplevelcontrol: " + this.TopLevelControl; 
     } 
    } 

Form1 chỉ là một biểu mẫu trống.

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 

     MessageBox.Show(" this: " + this + " owner: " + this.Owner); 
    } 
} 

Các Owner hiển thị trong hộp thông báo và TopLevelControl hiển thị trong nhãn là null khi tổ chức trong WPF, nhưng có giá trị khi tổ chức trong một ứng dụng WinForms.

Tiếp tục điều tra

Tôi đoán vấn đề ở đây là .Owner là loại Form và không có thể hiện của loại hình này trong ứng dụng WPF. Thật khó để tưởng tượng giá trị hợp lệ mà thuộc tính có thể có trong kịch bản này. Do đó, có vẻ như tôi cần phải thay đổi mã đang truy cập thuộc tính `.Owner 'trong Form1.

Trả lời

1
<Window 
    xmlns:my="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration" 
> 

<my:WindowsFormsHost Name="MapHost" ScrollViewer.CanContentScroll="False" SizeChanged="MapHost_SizeChanged" /> 

MapControl thừa hưởng System.Windows.Forms.Control

MapHost.Child = MapControl; 
+0

Cảm ơn cho điều này - tuy nhiên, tôi đã sử dụng WindowsFormsHost trong btnAdd_Click ** của tôi() ** phương pháp. Tôi đã cố gắng tuyên bố điều khiển máy chủ trực tiếp trong XAML quá, nhưng tôi vẫn gặp vấn đề với việc mở biểu mẫu tiếp theo mà không có chủ sở hữu. Tôi sẽ cố làm rõ điều này trong câu hỏi của tôi. – doornail

+0

Được rồi, tôi đã sửa đổi câu hỏi của mình để đặt WindowsFormsHost trong XAML thay vì khởi tạo nó trong ** btnAdd_Click() **. Tôi vẫn nhận được cùng một vấn đề, thật không may. – doornail

+0

@doornail ... Bạn đã thử đặt chủ sở hữu ??? MyForm.Owner = này (WPF Window); – 0x4f3759df

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