我有两个WPF窗口,我想这样做:当用户点击位于第一个窗口的按钮时,将打开第二个窗口,在此窗口中,用户将单击例如按钮" Sword"。然后在第一个窗口的文本块中,文本将显示" Sword"立即
我知道我可以使用文本文件或XML文件或类传输文本或字符串。但我不知道如何立即这样做。我应该使用计时器还是其他方式?
感谢您的回复。
答案 0 :(得分:1)
最简单的方法是将第一个窗口作为参数传递给第二个窗口的构造函数,并在按钮单击事件处理程序中更改第一个窗口的属性。
public class SecondWindow : Window
{
private readonly FirstWindow _owner;
public SecondWindow(FirstWindow owner)
{
_owner = owner;
}
private void OnSwordButtonClick(object sender, EventArgs e)
{
_owner.TextBlockValue = "New value";
}
}
您可以使用EventAggregator或其他event-based patterns更多的复杂和通用解决方案。事件聚合器有助于在低耦合应用程序中实现订阅者/发布者模式。
首先使用要在组件之间发送的属性创建新事件(如果此事件中没有数据,则不带任何属性)。
接下来订阅事件的第一个窗口,并在事件处理程序中使用从handler参数接收的参数更改数据(string
绑定到Label
或其他模型属性)。
最后在按钮点击事件处理程序的第二个窗口中提升(或以其他方式发布)您的事件。
正如您所看到的,两个实现都是MVVM库的一部分,this pattern对您的应用程序非常有用。
修改强>
您的代码示例显示了NullReferenceException
的问题。这是因为您以错误的方式调用Window1
构造函数。我在下面写完整的示例,但尝试再次重复更多细节。将您的代码更改为下一个:
public class Window1 : Window
{
private readonly MainWindow _owner;
// The only constructor of Window1 class
public Window1(MainWindow owner)
{
InitializeComponent();
_owner = owner;
}
private void button_Click(object sender, RoutedEventArgs e)
{
_owner.TbW1.Text = "Sword1";
}
}
public class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void button_Click(object sender, RoutedEventArgs e)
{
// create new instance of Window1 and pass current window as a constructor parameter
var win1 = new Window1(this);
win1.Show();
}
}
此外,还有很多建议。
OptionsWindow
而不是Window1
OnChooseSwordButtonClick()
,而不是button_Click。详细了解Naming Guidelines on MSDN。NullReferenceException
。答案 1 :(得分:0)
您正在寻找的术语是Interprocess Communications (IPC)。
Here is an excerpt from Microsoft:
Windows操作系统提供了便利的机制 应用程序之间的通信和数据共享总的来说, 这些机制启用的活动称为进程间 通信(IPC)。某些形式的IPC有助于划分 在几个专业过程中劳动。其他形式的IPC 促进网络上计算机之间的分工。