【问题标题】:Passing data between WPF forms在 WPF 表单之间传递数据
【发布时间】:2025-12-08 23:00:02
【问题描述】:

form1 有一个button btnInvoke,它调用form2form2 包含一个 textbox 和一个 button btn2

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

btn2 被点击时,form2 必须将textbox data 发送到form1

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

我该怎么办?

【问题讨论】:

  • 显示您尝试过的代码。
  • 在form2中创建一个事件,并让form1订阅它。然后当btn2被点击时,调用事件。
  • 查看 Application.Current.Properties

标签: c# wpf button


【解决方案1】:

您可以使用两种方法。第一个是使用 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; }
    }
}

【讨论】:

    【解决方案2】:

    在您的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 中命名您的窗口。 Form 通常与 WinForm 应用程序一起使用。

    【讨论】:

    • "form1" 不起作用。它必须是一个整数。什么整数?
    【解决方案3】:

    这可能有点矫枉过正,但EventAggregator 可能是一个不错的解决方案。它将允许您在 form1 中引发一个事件,然后可以从 form2 订阅。

    有一些在https://*.com/questions/2343980/event-aggregator-implementation-sample-best-practices 中实现EventAggregator 的细节和示例。

    【讨论】:

      【解决方案4】:

      由于您使用的是 WPF,因此请使用 CommandBindingsMessaging。我还建议您仔细查看 MVVM 框架,我更喜欢 MVVM Light Toolkit。框架有很多HowTos,去google就行了。

      【讨论】: