WPF用ShowDialog()彈出窗體時控制該窗體的顯示位置,並傳值回父窗體


原文: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中設置相應的判斷(不推薦,如產生變更可能因忘記修改導致不同步,除非是特簡單的條件);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM