原文:http://blog.csdn.net/kiss0622/article/details/5852153
方法一:
1.父窗口代碼
Window1.xaml.cs
private void Button_Click(object sender, RoutedEventArgs e) { Window2 w2 = new Window2(this.Top, this.Left);//this.Top,this.Left 作用是將當前父窗體的位置傳給子窗體 if (w2.ShowDialog()==true) { text1.Text = w2.name; } } }
2.子窗口代碼
Window2.xaml.cs
public string name; public Window2(double x,double y) { InitializeComponent(); //啟用‘Manual’屬性后,可以手動設置窗體的顯示位置 this.WindowStartupLocation = WindowStartupLocation.Manual; this.Top = x; this.Left = y; //如需手動綁定事件,如下
this.but1.AddHandler(Button.ClickEvent,new RoutedEventHandler(OkButton_Click)); } private void but1_Click(object sender, RoutedEventArgs e) { name = "hlr"; this.DialogResult = true;//必須設置,否則無法回傳 }
如果使用MVVM,當前按鈕有command事件,並且command中有判斷條件,這里應該相應的做修改,示例如下:
選中DataGrid某行,才允許繼續往下執行,即執行父窗口的if (w2.ShowDialog()==true){}內的代碼,否則,沒選中也執行
var item = this.DataGrid.SelectedItem; if (item != null) { this.DialogResult = true; }
方法二:使用事件(MVVM下)
場景:通過命令,調出查詢窗口,將選中項數據傳回
父窗口的VM
#region 信息檢索命令 private RelayCommand _SearchCommand; public RelayCommand SearchCommand { get { return _SearchCommand ?? (_SearchCommand = new RelayCommand(ExecuteSearchCommand)); } } /// <summary> /// 檢索命令邏輯 /// </summary> /// <param name="obj"></param> private void ExecuteSearchCommand(object obj)//object obj { AddDialog v = new AddDialog(); v.Closed += v_Closed; v.ShowDialog(); } private void v_Closed(object sender, EventArgs e) { var frm = (AddDialog)sender; var item = (ModelAdd)frm.DataGrid.SelectedItem; if (item != null) { var id = item.ID; } } #endregion
存在的隱患:
只要窗口關閉,都會執行v_Closed
場景示例:選中DataGrid某行,點擊確認按鈕,確認事件中通過一定的判斷規則,符合條件則執行v_Closed
可能隱患:用戶選中DataGrid某行,但是點擊了取消按鈕,並無驗證“確認事件”中的判斷規則,執行v_Closed導致出錯
解決:設置共有變量進行狀態控制;在v_Closed中設置相應的判斷(不推薦,如產生變更可能因忘記修改導致不同步,除非是特簡單的條件);