2017-06-15 4 views
0

J'ai un dialogue WPF, qui héberge un contrôle windowsFormHost, avec quelque chose comme çaFermez la boîte de dialogue WPF lorsque l'on clique sur un bouton à l'intérieur du WindowsFormHost

<Window x:Class="WPFSort.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:WPFSort" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <WindowsFormsHost HorizontalAlignment="Left" Height="Auto" 
          Margin="87,43,0,0" VerticalAlignment="Top" Width="Auto"> 
      <local:SimpleWinControl /> 
     </WindowsFormsHost> 

    </Grid> 
</Window> 

Et pour le SimpleWinControl, il est un contrôle WinForm. Lorsque button 1 est cliquée, je veux

  1. La boîte de dialogue WPF à fermer
  2. Et les données importantdata pour être « passer à » la forme WPF qui appelle la boîte de dialogue WPF?

    public partial class SimpleWinControl : UserControl 
    { 
        public SimpleWinControl() 
        { 
         InitializeComponent(); 
        } 
    
        public object importantdata; 
    
        private void button1_Click(object sender, EventArgs e) 
        { 
         //how should I write the close and pass the importantdata out 
    
        } 
    } 
    

Répondre

1

Vous pouvez par exemple ajouter un logement à votre contrôle WinForms qui expose le contrôle Button:

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

    public Button TheButton { get { return button1; } } 

    ... 
} 

Donnez les WinForms contrôlent un x:Name dans votre balisage XAML:

<WindowsFormsHost HorizontalAlignment="Left" Height="Auto" Margin="87,43,0,0" VerticalAlignment="Top" Width="Auto"> 
    <local:SimpleWinControl x:Name="winFormsControl" /> 
</WindowsFormsHost> 

... et de se connecter à l'événement Click du Button dans le code-behind de la fenêtre de dialogue WPF:

public partial class Dialog : Window 
{ 
    public Dialog() 
    { 
     InitializeComponent(); 
     winFormsControl.TheButton.Click += (s, e) => this.Close(); 
    } 
} 

La fenêtre qui ouvre la boîte de dialogue pourrait alors accéder au champ importantdata une fois renvoyée par la méthode ShowDialog:

private void ShowDialog_Click(object sender, RoutedEventArgs e) 
{ 
    Dialog d = new Dialog(); 
    d.ShowDialog(); 

    object importantData = d.winFormsControl.importantdata; 
} 

Une autre option pourrait consister à augmenter un événement du contrôle WinForms: https://msdn.microsoft.com/en-us/library/5z57dxz2(v=vs.90).aspx