2016-08-25 2 views
0

Возможно, я не буду проясняться в названии, при необходимости измените его. Теперь я подхожу к объяснению:WPF + Windows Forms, откройте вторую форму как дочерний элемент MainWindow из первой формы

У меня есть программа, выполненная в WPF (вызывают графику). MainWindow открывает первую форму с помощью кнопки, Form1 делает некоторые вещи, меняя пользовательский интерфейс MainWindow, и когда это будет сделано, следует открыть Form2, чтобы он также делал некоторые изменения пользовательского интерфейса MainWindow, но я не могу откройте форму Form2 через Form1.

Вот код:

MainWindow.xaml.cs

internal static MainWindow main; //It allows me to put the Form1 in the same context in order to change the UI 
private void start_button_Click(object sender, RoutedEventArgs e) 
{ 
    Form1 frm = new Form1(this); 
    frm.Show(); 
} 

Form1.cs

//function that allow me to communicate with the MainWindow 
private MainWindow main1 = null; 

public Form1(MainWindow callingForm) 
{ 
    main1 = callingForm as MainWindow; 
    InitializeComponent(); 
} 

//Load function 
private void Form1_Load(object sender, EventArgs e) 
{ 
    //do some stuff changing MainWindow UI 
    Form2 frm = new Form2(main1); //no compilation error 
    frm.Show(); 
} 

Теперь Form2 не открывается. Я также попытался сделать это, назвав пустоту, которая находится в MainWindow с Form1, но ничего. Что мне нужно сделать? ПРИМЕЧАНИЕ ХОРОШО: необходимо изменить пользовательский интерфейс главного окна также с помощью Form2, и мне нужно, чтобы Form2 был открыт только в конце вычислений Form1.

+0

Какое пространство имен является 'Form'? Похоже, это для Winforms? –

+0

Пространство имен "Application__WPF" @lll – Northumber

+0

Можете ли вы попробовать обернуть вызов функции для 'Form2' в' Dispatcher'? Такие, как 'Dispatcher.BeginInvoke' –

ответ

0
public Form1(MainWindow callingForm) 
    { 
     main1 = callingForm as MainWindow; 
     InitializeComponent(); 
     this.Load += Form1_Load; 
    } 
+0

Это приводит к сбою всего Form1, он автоматически загружается – Northumber

0

Если вы пытаетесь открыть окно из MainWindow, я бы порекомендовал вам использовать events создать экземпляр окна.

Немного странно от структурной точки зрения до детского вида, чтобы сказать родителям: «Эй, я хочу, чтобы ВЫ открыли эту форму» - но это Form1 создает и показывает это.

Я хотел бы сделать что-то вроде этого:

MainWindow:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void start_button_Click(object sender, RoutedEventArgs e) 
    { 
     Form1 frm = new Form1(); 
     frm.MyEvent += Form1EventMethod; 
     frm.Show(); 
    } 

    private void Form1EventMethod(object sender, EventArgs e) 
    { 
     // You can add here what you need to change in the MainWindow. 

     Form2 frm = new Form2(); 
     frm.Show(); 
    } 
} 

Form1:

public partial class Form1 : Window 
{ 
    public event EventHandler MyEvent; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void show_form_Click(object sender, EventArgs e) 
    { 
     if(MyEvent != null) 
      MyEvent(this, new EventArgs()); 
    } 
} 

Кроме того, этот способ, вы можете подписаться больше, чем просто MainWindow, если вы хотите что-то сделать, когда это событие будет поднято. Кроме того, вы можете передавать разные параметры своим подписчикам. Ваши взгляды будут разделены и не зависят от того и другого.

+0

Приятная попытка, хорошее объяснение, но не работает :(Form2 не показывает – Northumber

Смежные вопросы