簡體   English   中英

我應該如何在涉及“MainWindow”(C#)的 WPF Windows 之間傳遞數據?

[英]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 ,需要訪問其中找到的變量/方法。


這是我的 C# 代碼(我試圖有明確的變量名稱)。 該程序的要點是您可以將一些數據存儲在 Form 1 上,然后在單擊按鈕時將其傳遞給 Form 2。 從這里,它可以根據用戶的意願進行修改,然后可以在 Form 2 關閉時從 Form 1 再次訪問它。

在這個例子中,我只是表明我已經找到了一種在表單之間傳輸數據的方法,但我確信還有更好的方法。 具體來說,我確信有一種更好的方法,而不是為Window2 class 編寫具有不同參數的不同構造函數。


先 WPF Window 代碼:

 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的方法?
  • 創建另一個 WPF window 並假裝它是我的“主屏幕”以便我可以輕松訪問它的屬性會更好嗎?
  • 如果沒有,是否有更好的方法來使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM