'Call a function when button is clicked in a different window (WPF app)

I launch a window from a page of my wpf app and I would like to call a function when a button is pressed in the child window

Here is the page that calls the window :

namespace AppWpf10
{
    public partial class Prepare : System.Windows.Controls.Page
    {
        private void button_Click(object sender, RoutedEventArgs e)
        {
            Choice win2 = new Choice();
            win2.Show();
        }

        public void DoStuff()
        {
            //CODE THAT DOES STUFF
        }
    }
}

The window launched :

namespace appWpf10
{
    public partial class Choice : Window
    {
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
    }
}

So I would like DoStuff()to be called upon button1 being pressed in the other window. How should I do it ? By calling DoStuff() in button1_Click from the child window ? Or by adding an event "button1 pressed in the other window" ?

Either way, anyone knows how to write it ? Thanks in advance !



Solution 1:[1]

Well, there are many ways and by the looks of it, you're not going the MVVM route, which is fine. So, in your particular situation, a simple way is to subscribe to the child's button click event when you actually create the child, given that you named the button:

namespace AppWpf10
{
    public partial class Prepare : System.Windows.Controls.Page
    {
        private void button_Click(object sender, RoutedEventArgs e)
        {
            Choice win2 = new Choice();
            win2.Show();
            win2.button1.Click += clickEventHandler;
        }

        private void clickEventHandler(object sender, RoutedEventArgs e)
        {
            DoStuff();
        }

        public void DoStuff()
        {
            //
        }
    }
}

Solution 2:[2]

One solution is to give parent to child window in constructor and then it can call its parent methods:

private void button_Click(object sender, RoutedEventArgs e)
{
    Choice win2 = new Choice(this);
    win2.Show();
}


public partial class Choice : Window
{
    Prepare parent;

    public Choice(Prepare parent)
    {
        this.parent = parent;
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        parent.DoStuff();
        this.Close();
    }
}

Solution 3:[3]

Below code works for me. I have generated event for show popup which popup control is putting in another (MainWindow) window page and I am rendering from FooterPanel which is my UserControl in WPF.

foreach (Window window in Application.Current.Windows)
{
     if (window.GetType() == typeof(MainWindow))
     {
         (window as MainWindow).MyPopup.IsOpen = true;
     }
}

You can also refer the link which has another way to doing it. https://docs.microsoft.com/en-us/dotnet/desktop/wpf/events/how-to-add-an-event-handler-using-code?view=netdesktop-6.0

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Martin Heralecký
Solution 3 Khushbu kadia