将详细信息从一个窗口传递到另一个窗口
本文关键字:窗口 另一个 一个 详细信息 | 更新日期: 2023-09-27 18:31:51
我有一个选择TextBoxes
,当用户希望注意到他们与另一个人有过接触时,他们会填写这些。大多数TextBoxes
都是通过键入来暗示填充的。但是,对于其中之一,我希望用户能够从单击按钮时出现的People
列表中进行选择。
这就是我遇到问题的地方。到目前为止,我刚刚出现了一个DataGrid
并处理了它SelectionChanged
填写TextBoxes
文本属性的方法。这工作正常,但是现在当前页面上没有足够的空间来显示整个DataGrid
以及他们可以选择的所有人员。
我决定以单独的较小Window
显示People
,当用户单击Button
时显示。 我遇到的问题是,当用户选择他们希望在新Window
中标记联系人Person
时,我不知道如何通知原始Window
已选择Person
,关闭新的较小Window
并在原始Window
上填写适当的TextBox
。
根据打开的Window
上的选择,在原始Window
上填写TextBox
的最直观方法是什么?
我会使用委托,它调用原始窗口的函数并用它解析更改的变量。因此,您知道用户何时单击了某些内容,并且可以直接对此"事件"做出反应。
链接:https://msdn.microsoft.com/en-us/library/ms173171.aspx
如果你使用像Galasoft的MVVM Light(http://www.galasoft.ch/)这样的框架,他们有一个专门用于此目的的信使系统。 它允许您"广播"可以被应用程序的任何其他部分"接收"的消息
这是在考虑使用域、模型、演示文稿(Winforms/WPF 版本的 MVC 格式)来执行应用时。
你可以让每个表单作为自己的类,嗯,它们是自己的类。 创建每个窗体类,但如果控件是私有的,则向其添加一些公共成员。 让它们仅具有"get"属性,并返回该形式的任何控件或变量的值。 您的主窗体将是控制窗体。 所有表单都将由主窗体处理,因此当您打开它时,它是主窗体可以访问的类。
现在,如果我记得(最近一直在做更多的 MVC 而不是任何 Winforms),我相信如果你使用 ShowDialog() 方法它会冻结主线程,所以当你关闭主窗体时,你可以继续阅读你打开的表单类中的公共成员。 同步我相信它运行为。 如果你只使用 Show(),线程将继续异步运行。 使用异步,您可能必须在启动代码中使用主窗体,因此始终存在一个窗口,但订阅窗体的关闭事件,并具有可以获取这些公共成员的方法。 请务必在主类的根目录下实例化额外的窗体,以便在调用它的方法存在时它不会超出范围。 您甚至可以使调用的方法成为异步调用,并在对窗体运行 Show 方法的命令之前有一个 await。
摘要,将每个窗体视为其自己的类,但添加可以从所需的控件和/或变量中读取值的公共成员。 当类通过事件关闭时,或者当线程从窗体关闭时同步读取该数据。 窗体关闭不会丢弃对象,只会丢弃窗体的可视化。
哦,如果您要将信息从主窗体传递给正在打开的子窗体,请为该窗体类添加一个构造函数,该构造函数将您的输入作为模型或值以在显示之前填写适当的变量或窗体,或者创建一个公共属性,您可以在显示类之前放入要发送的值。
记住,一切都是一类,一旦你这样看待它并这样对待它,答案就会到来。 :-)
我应该警告,我是一个冗长的解释者。
在工作中,将所有这些从内存中记下,因此可能存在一些错误。 如果有,请告诉我。
我认为问题是访问主窗口的控件,不是吗?可以使用以下构造定义更改用户选择和访问 MainWindow 控件的事件:
((MainWindow)Application.Current.MainWindow).MyTextBox