博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF用ShowDialog()弹出窗体时控制该窗体的显示位置,并传值回父窗体
阅读量:6613 次
发布时间:2019-06-24

本文共 2225 字,大约阅读时间需要 7 分钟。

原文: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));            }        }        ///         /// 检索命令逻辑        ///         ///         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中设置相应的判断(不推荐,如产生变更可能因忘记修改导致不同步,除非是特简单的条件);

 

你可能感兴趣的文章
用眼睛来控制家用电器真能实现?科学家设计新型传感器探测眨眼动作
查看>>
国家射频识别联盟新标准发布
查看>>
安防IT化冲击 产品、产业以及服务有哪些变化
查看>>
Solaris 10 x86 Mono 三次折腾准备休战了
查看>>
华南技术盛会:BingoDay2017今在天河人才港盛大举行
查看>>
一张图,看懂全球微信、LINE们的势力分布
查看>>
D1net阅闻:英特尔爆发人事地震 PC芯片等多名一把手离职
查看>>
运营商2015年运营成绩单:中国移动发足狂奔
查看>>
韩国:高通涉嫌垄断 拟罚59亿元创纪录
查看>>
OA选型有哪些易忽略的细节
查看>>
光纤布线系统如何打造绿色数据中心?
查看>>
一家以色列公司要帮FBI解锁iPhone
查看>>
IT企业的云存储安全方法都是错的
查看>>
英特尔进军穿戴和物联网 RealSense技术成标配
查看>>
比特币等公有链不适合物联网行业?物联网需要专用区块链
查看>>
Worktile企业版上线 满足互联网时代的办公新需求
查看>>
RSA加密或成历史 麻省理工研制出5原子量子计算机
查看>>
致所有测试人员的信
查看>>
Microsoft将在VS 2017中提供“实时单元测试”特性
查看>>
印度有望挤下日本 成2017年全球第三大光伏市场
查看>>