Вы можете сделать это, создав метод перегрузки для вашего окна или просто создав свойство publi c, которое вы можете установить для него перед показом ... Я покажу оба варианта.
Во-первых, создайте функцию в своем первом окне, которая ожидает в качестве входных параметров нужные вам компоненты. Я сделаю это на основе изображения и двух строк, но они могут быть такими, какими вы хотите.
public void ThisMethodInFirstWindow(Image ImageFromThisForm, string firstText, string secondText)
{
// now in your first form, do whatever you need to with the now
// available parameters coming from the second form. You still should
// validate nothing is NULL or empty or whatever rules you have...
}
Теперь, во втором окне, как указано, вы можете перегрузить или просто создать publi c свойство как «действие». Это похоже на метод обратного вызова. Вы просто говорите эй ... когда вам нужно, вы можете передать этому действию нужные вам значения, и оно будет использовать их для вас ...
public partial class Window2 : Window
{
public Window2()
{
InitializeComponent();
}
// declare an overloaded function to the window that accepts a function
// but also calls its default constructor for InitializeComponent() in case
// you have other preparation stuff going on in the window.
public Window2(Action<Image, string, string> doWhatInOriginalWindow ) : this()
{
PassBackToMainWindow = doWhatInOriginalWindow;
}
public Action<Image, string, string> PassBackToMainWindow {get; set;}
}
Обратите внимание, что свойство PassBackToMainWindow
имеет подпись , который ожидает 3 параметра изображения, строки и строки. Также обратите внимание, что перегруженный метод окна имеет одно и то же объявление Action, и все они соответствуют подписи, созданной в первом окне.
Теперь мы можем вызвать окно ... обе версии ...
// Here, you are passing the METHOD name you want to handle the data to be added
// this uses the overload method
Window2 w = new Window2(ThisMethodInFirstWindow);
w.ShowDialog();
или
// this version creates window. Specifically applies the action to tell what method
// you explicitly want called from within the second form, THEN show the window last
Window2 w = new Window2();
w.PassBackToMainWindow = ThisMethodInFirstWindow;
w.ShowDialog();
Наконец, как вы его используете. В кнопке Сохранить в форме добавьте следующее для действия кнопки во втором окне. С точки зрения второго окна у вас есть свойство действия. Поэтому просто назовите его так, как если бы это был метод непосредственно во второй форме, но поскольку это действие, указывающее на первую форму, вы просто передаете поля для поездки, и первая форма их получает.
private void Button_Click(object sender, RoutedEventArgs e)
{
if (PassBackToMainWindow == null)
return;
PassBackToMainWindow(ImageFromThisForm, ThisWindow.Text1.Text, ThisWindow.Text2.Text);
}
Теперь, вместо огромного набора параметров, если у вас есть структурный класс с множеством свойств, например
public class MySampleThing
{
public Image MyImageForWindow {get; set;}
public string MyText1 {get; set;}
public string MyText1 {get; set;}
}
Тогда вы можете просто изменить сигнатуру метода. и элементы действий на
public void SomeFunction( MySampleThing singleInboundParameter )
{
// Now you can use EVERYTHING available on your object parameter
var tmp = singleInboundParameter.MyImageForWindow;
// etc.
}
И действия будут перечислены как
Action<MySampleThing>
И в качестве последнего вы можете просто передать обратно все Window2, например
public void SomeFunction( Window2 entire2ndWindow )
Action<Window2>