[英]How should I pass data between WPF Windows involving `MainWindow` (C#)?
我目前正在啟動一個 C# 項目,在該項目中我正在為一台簡單的 ATM 機建模,因此需要幾個屏幕。 在編寫 StockTicker 棋盤游戲改編代碼之前,我遇到過在屏幕之間傳遞數據的問題,但我認為我的解決方法不是很好。
我的很多問題都源於我使用MainWindow
作為應用程序的主要 window 。 我能夠輕松地將數據從輔助 window 傳遞回主 window,因為我可以在Window1
class 關閉后訪問它的屬性。 但是,要從MainWindow
轉移到Window2
,我必須向Window2
的構造函數添加一個參數,這將使我能夠傳遞必要的值。
雖然這確實適用於小型應用程序,但我認為這對於需要傳遞給Window2
的更多內容來說會變得很長/很混亂。 此外,我根本不知道如何從Window2
訪問我在MainWindow
上聲明的任何方法。 由於MainWindow
是主屏幕,我的大部分編碼都在它的 class 中。
Window2
訪問我在MainWindow
中放入的方法? (澄清)我花了一些時間環顧四周,找不到一個明確的例子,具體涉及MainWindow
,需要訪問其中找到的變量/方法。
在這個例子中,我只是表明我已經找到了一種在表單之間傳輸數據的方法,但我確信還有更好的方法。 具體來說,我確信有一種更好的方法,而不是為Window2
class 編寫具有不同參數的不同構造函數。
namespace Banking_System { public partial class MainWindow: Window { public MainWindow() { InitializeComponent(); } private void btnSwitchForm_Click(object sender, RoutedEventArgs e) { string strForm1Text = txtForm1TextBox.Text; Window2 newWindow = new Window2(strForm1Text); newWindow.ShowDialog(); txtForm2TextBox.Text = newWindow.strForm2Text; } } }
第二 WPF Window 代碼:
namespace Banking_System { public partial class Window2: Window { public string strForm2Text { get; set; } public Window2(string form1) { InitializeComponent(); txtForm1.Text = form1; } private void btnSwitchBack_Click(object sender, RoutedEventArgs e) { strForm2Text = txtForm2TextBox.Text; this.Close(); } } }
我最好創建另一個 WPF window,並在MainWindow
加載后立即加載,然后隱藏MainWindow
並“假裝”另一個 window 是主屏幕? 因為那時我可以簡單地以與上面相同的方式訪問屬性(從Window2
傳輸到MainWindow
時)。
IE。 當需要從另一個 window 訪問變量/方法時,只需聲明一個新的臨時 window 並訪問它的屬性/方法:
FakeMainWindow wndPrimary = new FakeMainWindow(); wndPrimary.strProperty= "test"; wndPrimary.methodCall();
這種方式對我的主要吸引力在於我可以訪問另一個 window 上的方法(如上圖所示),而在使用MainWindow
作為我的主要形式時我無法做到這一點。
概括
Window2
放入MainWindow
的方法?MainWindow
?如果我遺漏了什么,請告訴我。 謝謝!
您實際上可以訪問應用程序的主窗口,而無需在窗口之間傳遞任何引用。 Application.Current.MainWindow
返回在 app.xaml 中聲明的主窗口的實例。 它返回一個Window
(您的主窗口源自該窗口),因此您需要對其進行強制轉換才能訪問其成員。
例如,您可以在第二個窗口中使用此代碼:
((MainWindow)Application.Current.MainWindow).txtForm1TextBox.Text = "Some text";
話雖如此,我建議您對 WPF 設計模式(特別是MVVM )進行一些研究。
通過整個窗口
這將是主窗口
Window2 newWindow = new Window2(this);
您可以將第一個窗口設置為第二個窗口的 DataContext :
namespace Banking_System
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void btnSwitchForm_Click(object sender, RoutedEventArgs e)
{
Window2 newWindow = new Window2(strForm1Text);
newWindow.DataContext = this;
newWindow.ShowDialog();
}
}
public partial class MainWindow2 : Window
{
public MainWindow2()
{
var window1 = this.DataContext;
}
}
}
此外,我建議您的 Window 將它自己的 ViewModel 設置為可以發送到另一個窗口的 DataContext。 通過這種方式,您還可以將屬性直接綁定到兩個窗口,而不必擔心手動更新它們。
create a static class & put static methods & or static properties that are common to all windows.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.