WPF Prism MVVM 中 弹出新窗体. 放入用户控件., 传入一些数据,并且可以返回一些数据.
对于一个WPF MVVM 的 萌新来说. 必然会遇到一个 弹出 新窗口 的问题.
今天,就和大家分享一下,这个问题的解决方法.
.
一. 准备
- .dll
- .CS 文件 (StylePopupWindowAction.cs)
- .xaml 文件(BorderlessWindow.xaml)
这里是 实例化一个窗口,然后 加载窗口的样式. ( StylePopupWindowAction.cs)
using System;
using System.Windows;
using System.Windows.Input;
using Prism.Interactivity;
using Prism.Interactivity.InteractionRequest;
namespace HXDJSsYSTEM.WindowAction
{
public class StylePopupWindowAction : PopupWindowAction
{
private Window _wrapperWindow;
///
/// 通过重写PopupWindowAction中的GetWindow方法,设置Window的Style属性。
/// 否则打开的只能是默认窗体,无法设置样式。
///
///
///
protected override Window GetWindow(INotification notification)
{
if (this.WindowContent != null)
{
//初始化窗口
_wrapperWindow = new Window
{
//数据上下文
DataContext = notification,
Title = notification.Title,
//宽高自适应 内容
SizeToContent = SizeToContent.WidthAndHeight,
};
_wrapperWindow.KeyDown += WrapperWindow_KeyDown;
ResourceDictionary langRd = null;
try
{
//读取资源文件(样式)
langRd = Application.LoadComponent(new Uri("/WindowAction/BorderlessWindow.xaml", UriKind.RelativeOrAbsolute)) as ResourceDictionary;
}
catch
{
}
//判断资源是否 读取成功.读取成功则不为null
if (langRd != null)
{
//判断是否已经有资源. 如果有 就 clear;
if (_wrapperWindow.Resources.MergedDictionaries.Count > 0)
{
_wrapperWindow.Resources.MergedDictionaries.Clear();
}
//将资源加入到window中
_wrapperWindow.Resources.MergedDictionaries.Add(langRd);
}
//将传入的 notification 放入 window
PrepareContentForWindow(notification, _wrapperWindow);
}
else
{
//如果WindowContent 等于null 则 生成默认窗口
_wrapperWindow = this.CreateDefaultWindow(notification);
}
return _wrapperWindow;
}
///
/// 键盘按下 事件
///
///
///
private void WrapperWindow_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
//按下ESC 关闭窗口
if (e.Key == Key.Escape)
{
_wrapperWindow.Close();
}
}
}
}
这里是上面代码 要加载的 样式 ( BorderlessWindow.xaml )
#ffffff
二. 我们该怎么用它.
2.窗口的 ViewModel
在这里我们需要引用命名空间 ,大家没有这个DLL的 可以在NuGet上搜索.安装就可以了.
3.这里是ViewModel的具体方法
- 定义
- 在构造参数中实例化
- 传入Content和Title
4.要放入Window 中 的 用户控件 的ViewModel
5.用户控件的ViewModel 中的具体操作
- 放入返回值
- 关闭窗口
注意:
- 用户控件 在触发器那里指定的时候,要注意 防止出现死循环. 会报错…
- 这只是其中一种解决方案… 可能不是最好的.
这些就是 这个 弹出窗体的 具体操作了. 也比较简单. 看不懂的 多看两遍. 然后 动手操作一下.