在WPF的两个窗口之间传递内容

本文关键字:之间 窗口 两个 WPF | 更新日期: 2023-09-27 17:52:16

我的问题是,将一些信息从WPF窗口传递到现有的WPF页面。我想通过按下WPF Page1上的按钮打开一个窗口。然后,我必须得到所有的文本存储在Textbox1到Page1中的一个变量。但只有当用户按下"窗口"上的ButtonXY时。我怎么能解决这个问题,而不使用"绑定",因为必须有一个大的"开关"子句旁边的Page1?

在WPF的两个窗口之间传递内容

如果你使用MVVM,那么窗口和页面都可以有一个共同的ViewModel和那些文本框应该绑定到相同的属性与UpdateSourceTrigger设置为PropertyChanged,这样就不需要更多的事件或通知。

否则,有时我倾向于创建一个全局项目,它将在需要的地方作为引用添加。这样,您就可以设置事件及其处理程序来完成您的特定问题。我认为这不是一个优雅的解决方案,但它帮助我在不同的项目或类之间进行了很多沟通。

创建一个新类,它将包含您想要在所有窗口之间传输的所有数据。

public  YourNewClassWithSettings
{
   string StringNumber1;
   string StringNumber2;
}

在主窗口中创建该类的实例,并设置所需属性的值。

通过引用将YourNewClassWithSettings的实例传递给下一个窗口的构造函数。

YourNewClassWithSettings test = new YourNewClassWithSettings();
test.StringNumber1 = "mySetting";
WindowControl w = new WindowControl(ref test);
w.ShowDialog();
//See what was changed!!!!
string changedValue = test.StringNumber1; //Will be "IamDone"

在你的构造函数中你会说:

public WindowControl(ref YourNewClassWithSettings test)
{
   // example: You can now say TextBox1.Text =  test.StringNumber1;
   // Whatever you change here like test.
   test.StringNumber1 = "IamDone";
   //When you close this window, because test was passed by ref : you
   // will see StringNumber1 = "IamDone" in your main window again
   //when accessing the property of that class. Always pass by ref
   this.Close();
}

假设您有一个MainWindow和一个SubWindow

您的SubWindow包含ButtonTextbox。当你点击SubWindow中的Button时,你想把TextTextbox转移到MainWindow

主窗口。您实现了一个Property (Getter和Setter),它将包含传输的Text字符串。MainWindow也包含SubWindow !不要忘记将MainWindow传递给SubWindow构造函数(如下所示),以便SubWindow知道MainWindow实例

public partial class MainWindow : Window
{
    public string Text { get; set; }
    private Window subWindow;
    public MainWindow()
    {
        InitializeComponent();
        subWindow = new SubWindow(this);
        subWindow.Show();
    }
}

好子窗口

public partial class SubWindow : Window
{
    private Window mainWindow;
    public SubWindow(Window mainWindow)
    {
        this.mainWindow = mainWindow;
        InitializeComponent();
    }
    private void ButtonTransferTheData_Click(object sender, RoutedEventArgs e)
    {
        mainWindow.Text = myTextBoxInSubWindow.Text;
    }
}

你的SubWindow知道MainWindow。所以你可以访问Text Property。在按钮上单击您将TextTextbox写入MainWindowProperty

提示mainWindow.Text = myTextBoxInSubWindow.Text;行可能抛出异常。这是因为您希望从另一个线程访问一个线程。所以你需要调度它。将这一行改为:

Dispatcher.Invoke(() => mainWindow.Text = myTextBoxInSubWindow.Text);