WPF用ShowDialog()弹出窗体时控制该窗体的显示位置,并传值回父窗体

简介: 原文:http://blog.csdn.net/kiss0622/article/details/5852153 方法一: 1.父窗口代码 Window1.xaml.cs private void Button_Click(object sender, RoutedEventArgs e...

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

 

相关文章
|
C# 编解码
WPF C# 多屏情况下,实现窗体显示到指定的屏幕内
原文:WPF C# 多屏情况下,实现窗体显示到指定的屏幕内 针对于一个程序,需要在两个显示屏上显示不同的窗体,(亦或N个显示屏N个窗体),可以使用如下的方式实现。
4810 0
|
12月前
|
C#
WPF控件和窗体一起放大一起缩小
WPF控件和窗体一起放大一起缩小
199 0
|
12月前
|
C# 容器
WPF框架下,窗体的嵌套显示
WPF框架下,窗体的嵌套显示
193 0
|
C# 索引
WPF实用指南二:移除窗体的图标
原文:WPF实用指南二:移除窗体的图标 WPF没有提供任何功能来移除窗体上的icon图标。一般的做法是设置一个空白的图标,如下图1: 这种做法在窗体边框与标题之间仍然会保留一片空白。
1180 0
|
C#
WPF中制作无边框窗体
原文:WPF中制作无边框窗体 众所周知,在WinForm中,如果要制作一个无边框窗体,可以将窗体的FormBorderStyle属性设置为None来完成。
1495 0
|
C#
WPF透明窗体制作
原文:WPF透明窗体制作 窗体的样式: 其中Border用来实现透明效果,Grid用来呈现窗体内的控件,为了避免窗体内的控件变成透明的,所以Border,Grid必须处在同一级别上。
880 0
|
C# 容器 前端开发
WPF Viewport3D 解决透视模式时窗体模糊
原文:WPF Viewport3D 解决透视模式时窗体模糊 最近折腾Viewport3D玩,遇到了一些诡异的问题,研究一下略有心得,特此和大家分享~ 三维图形概述: https://msdn.microsoft.com/zh-cn/library/ms747437.aspx 概要 三维坐标系         二维图形的 WPF 坐标系将原点定位在呈现区域(通常是屏幕)的左上角。
1007 0
|
C# Windows
WPF判断当前窗体是否为模态
原文:WPF判断当前窗体是否为模态 WPF判断当前窗体是否为模态   1、使用System.Windows.Interop.ComponentDispatcher.IsThreadModal来判断 参照:https://social.
1106 0
|
C#
wpf无边框窗体移动和大小调整
原文:wpf无边框窗体移动和大小调整   using System; using System.Windows; using System.
1614 0
|
C# Windows
WPF 窗体中获取键盘和鼠标无操作时的超时提示
原文:WPF 窗体中获取键盘和鼠标无操作时的超时提示 通过调用Windows API中的GetLastInputInfo来获取最后一次输入的时间 using System;using System.
874 0