在WPF表单之间传递数据

时间:2013-01-21 07:13:49

标签: c# wpf button

form1有一个button btnInvoke,可以调用form2form2包含textboxbutton btn2

用户必须在textbox中输入数据,然后按btn2

点击btn2后,form2必须将textbox data发送给form1

我尝试过传递构造函数,但我无法启动form1的新实例。

我该怎么办?

4 个答案:

答案 0 :(得分:10)

您可以使用两种方法。第一个是使用ShowDialog和一个公共方法,然后测试DialogResult是否为真,然后从方法中读取值。

if (newWindow.ShowDialog() == true)
            this.Title = newWindow.myText();

第二种方法是创建一个CustomEvent并在创建窗口中订阅它。

<强> MainWindow.xaml.cs

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

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        Window1 newWindow = new Window1();
        newWindow.RaiseCustomEvent += new EventHandler<CustomEventArgs>(newWindow_RaiseCustomEvent);
        newWindow.Show();

    }

    void newWindow_RaiseCustomEvent(object sender, CustomEventArgs e)
    {
        this.Title = e.Message;
    }
}

<强> Window1.xaml.cs

public partial class Window1 : Window
{
    public event EventHandler<CustomEventArgs> RaiseCustomEvent;

    public Window1()
    {
        InitializeComponent();
    }
    public string myText()
    {
        return textBox1.Text;
    }
    private void button1_Click(object sender, RoutedEventArgs e)
    {

        RaiseCustomEvent(this, new CustomEventArgs(textBox1.Text));
    }
}
public class CustomEventArgs : EventArgs
{
    public CustomEventArgs(string s)
    {
        msg = s;
    }
    private string msg;
    public string Message
    {
        get { return msg; }
    }
}

答案 1 :(得分:1)

form1中定义公共财产。

public string MyTextData { get; set; }

form2按钮上单击,获取form1的实例并将其属性设置为TextBox值。

var frm1 = Application.Current.Windows["form1"] as Form1;
if(frm1 ! = null)
    frm1.MyTextData  = yourTextBox.Text;

Form1 {} {}}中,您会收到属性MyTextData

中的文字

如果遵循命名窗口的约定,它会更好。使用Window代替Form来命名WPF中的窗口。表单通常与WinForm应用程序一起使用。

答案 2 :(得分:1)

这可能有点矫枉过正,但EventAggregator可能是一个不错的解决方案。它允许您在form1中举起一个可以从form2订阅的活动。

https://stackoverflow.com/questions/2343980/event-aggregator-implementation-sample-best-practices中有一些实施EventAggregator的详细信息和示例。

答案 3 :(得分:0)

由于您使用的是WPF,请使用CommandBindingsMessaging。我还建议你看看MVVM框架,我优先考虑MVVM Light Toolkit。该框架有很多HowTos,只需要谷歌。

相关问题