2012-12-11 10 views
5

Scenario

Ho il seguente scenario (che ho messo a nudo giù ad un'applicazione di esempio):Creazione di un modulo da un controllo WinForms ospitato all'interno di WPF - Proprietario non è impostato

  • A WPF applicazione con una finestra (MainWindow) che ospita un controllo utente WinForms (UserControl1).
    • Il controllo viene aggiunto dinamicamente nel codice dietro ad un WindowsFormsHost
  • UserControl1 ha un pulsante che apre il modulo (Form1)
    • utilizza form1.Show(this).

Il problema è: .Owner proprietà

  • Form1 s' è nullo.
    • Nell'applicazione reale, è stato eseguito un lavoro che riguarda la proprietà .Owner, il che significa che non posso ignorare questo problema. Idealmente, ovviamente, non ci sarebbe alcuna dipendenza qui.
    • Nell'applicazione reale, non ho il controllo del lato WinForms di questo codice. La nostra applicazione WPF ospita il controllo WinForms di un'altra squadra.
    • Note:
      • Quando uso una serie WinForms, invece, la proprietà .Owner è impostato correttamente.
      • UserControl1 è ospitato bene in tutti gli altri modi - nel vero tutto applicazione il resto funziona bene, è solo che la forma aperta dal il controllo utente non dispone di una vera e propria proprietario.

riesco a capire il motivo per cui c'è un problema qui, ma sto sperando che la risposta alla mia domanda successiva potrebbe essere 'sì'!

C'è qualcosa che posso fare per farlo funzionare modificando il lato WPF dell'equazione?

In caso contrario, potrebbe essere fatto qualcosa sul lato WinForms? (Non è oltre i regni di possibilità che ho potuto ottenere alcuni cambiamenti ci implementate ...)

codice di esempio

Ecco il codice di esempio nel mio app. In primo luogo il lato 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; 

    } 
} 

E ora il lato WinForms ...

UserControl1 è solo un controllo utente con un pulsante e un'etichetta su di esso. Ecco il codice:

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 è solo una forma vuota.

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

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

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

Il Owner mostrata nella finestra di messaggio e la TopLevelControl visualizzato sull'etichetta sono null quando ospitato in WPF, ma hanno un valore quando ospitata in un'altra applicazione WinForms.

Ulteriori indagini

Credo che il problema qui è che .Owner è di tipo Form e non c'è un'istanza di questo tipo nell'applicazione WPF. È difficile immaginare quale valore valido quella proprietà possa avere in questo scenario. Sembra quindi probabile che sia necessario ottenere il codice modificato che accede alla proprietà `.Owner 'in Form1.

risposta

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

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

MapControl eredita System.Windows.Forms.Control

MapHost.Child = MapControl; 
+0

Grazie per questo - tuttavia, sto già utilizzando WindowsFormsHost nel mio ** btnAdd_Click() ** metodo. Ho provato a dichiarare il controllo host direttamente anche in XAML, ma continuo ad avere il problema con la successiva apertura del modulo senza proprietario. Cercherò di chiarire questo nella mia domanda. – doornail

+0

Ok, ho modificato la mia domanda per inserire WindowsFormsHost in XAML invece di istanziarlo in ** btnAdd_Click() **. Ho ancora lo stesso problema, sfortunatamente. – doornail

+0

@doornail ... Hai provato a impostare il proprietario ??? MyForm.Owner = this (WPF Window); – 0x4f3759df

Problemi correlati