zoukankan      html  css  js  c++  java
  • 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中设置相应的判断(不推荐,如产生变更可能因忘记修改导致不同步,除非是特简单的条件);

  • 相关阅读:
    php魔术方法
    适用所有手机号码的正则表达式
    js按回车事件提交
    php 顺序线性表
    PLSQL连接远程oracle配置
    Jmeter 接口测试 —— 3种参数化方式
    Jmeter 接口测试 —— 3种采样器的使用
    【LICEcap】怎样用LICEcap录制屏幕及GIF图片
    WPS标题自动编号
    UT、IT、ST、UAT
  • 原文地址:https://www.cnblogs.com/xcsn/p/4462588.html
Copyright © 2011-2022 走看看