2012-01-12 1 views
0

У меня есть Form1 (parent), и у него есть элементHost (пользовательский контроль WPF). Теперь я хочу, чтобы пользовательский элемент управления WPF вызывал функцию из своего родителя или передавал значение/данные. Просто как тот.Ребенок (wpf usercontrol), вызывающий функцию из родителя (winForm)

Это код, я использую, но программа всегда врезаться ..

Form1:

public void samp() 
{ 
MessageBox.Show("Sample"); 
} 

WPF UserControl:

Form1 frm1 = new Form1(); 

public void test() 
{ 
frm1.samp(); 
} 

Можно для ребенка напрямую обратиться к родителям?

+0

«программа всегда рушится»? Какую ошибку вы получаете? –

+0

Нет, он не запускается. Мне нужно перезапустить VS. И он всегда дает 800 000K + в диспетчере задач (Процессы) –

+0

Я попытался воссоздать проблему, как вы описали: [см. Это] (http://dl.dropbox.com/u/3169795/StackOverflow/WpfApplication_Japs%20Asuncion.zip) но, похоже, для меня это работает. Может быть, вы можете загрузить свое решение где-нибудь? –

ответ

4

Эта программа не может работа! Вы создаете новый Form1 в пользовательском контроле Wpf. Form1 содержит этот usercontrol ... Так что это бесконечный цикл!

Вы должны бросить Parent свойства ElementHost хостинга для вашего WPF UserControl в Form1, то вы можете вызвать вашу функцию, например:

HwndSource wpfHandle = PresentationSource.FromVisual(this) as HwndSource; 
if (wpfHandle != null) 
{ 
    ElementHost host = System.Windows.Forms.Control.FromChildHandle(wpfHandle.Handle) as ElementHost; 
    if (host != null) 
    { 
     Form1 form1 = host.Parent as Form1; 
     if (form1 != null) 
     { 
      form1.samp(); 
     } 
    } 
} 
+0

так как я могу это сделать? –

+0

Зависит от того, где происходит создание Form1. Если он находится в конструкторе WPF UserControl (ElementHost.Child), тогда он будет infinte (потому что при создании Form1 будет создан новый USERControl WPF и т. Д.). Когда у кнопки WPF UserControl есть кнопка, которая (OnClick) создает Form1 и вызывает открытый метод, я не вижу проблемы ... –

+0

Это не бесконечный цикл. Это будет бесконечный цикл, если в процессе инициализации будет вызываться 'void test()' in in example, но его нет. –

0

Вам придется enject экземпляра родительского в элемент управления WPF , Затем, имея эту ссылку, вы можете манипулировать ею.