有如下幾種方式:
1. 聲明個全局變量,就是App.xaml里面聲明;在所有窗體里面都可以引用 Application.Current.Properties["ArgumentName"];
2. 第二個就是 在目標窗體上面公開個 屬性,直接賦值;
3. 最后就是在Uri里面傳參數 NavigationService.Navigate(window object,argument value)
4. 采用事件響應,傳遞值。
舉例:點擊主窗口MainWindow 上的一個OpenSubWindow按鈕 -> 打開子窗口SubWindow -> 在子窗口中的TextBox中輸入值, 點擊OK后關閉 -> 主窗口上的TextBox獲取子窗口中的值。
1. 在子窗口中定義一個事件PassValuesEvent。 當點擊 OK 按鈕時,觸發事件,並傳遞數值。( PassValuesEventArgs 是EventArgs類,需要同時定義好)
public partial class SubWindow : Window { public delegate void PassValuesHandler(object sender, PassValuesEventArgs e); public event PassValuesHandler PassValuesEvent; public SubWindow() { InitializeComponent(); } private void btnOK_Click(object sender, RoutedEventArgs e) { string value1 = tbValue1.Text; // Text Property return value is string type . int value2; Int32.TryParse(tbValue2.Text, out value2); PassValuesEventArgs args = new PassValuesEventArgs(value1, value2); PassValuesEvent(this, args); this.Close(); } }
2. 在主窗口中的OpenSubWindow按鈕點擊的方法中,訂閱了PassValuesEvent事件。當事件觸發時,獲取傳遞的參數的值。
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void btnOpenSubWindow_Click(object sender, RoutedEventArgs e) { SubWindow subWindow = new SubWindow(); // 訂閱事件 subWindow.PassValuesEvent += new SubWindow.PassValuesHandler(ReceiveValues); subWindow.Show(); } private void ReceiveValues(object sender, PassValuesEventArgs e) { this.tbValue1.Text = e.Value1; this.tbValue2.Text = e.Value2.ToString(); } }
若干年後更新:
在使用了MVVM后, 窗口閒的數據通訊實際上是Viewmodel之間的通訊, 這裏也有很多實現,其中,我個人喜歡MVVM Light 裏的Messager, 很簡單明瞭又好用.