[Prism框架实用分享]如何在主程序中合理的弹出子窗体
大家好
说起子窗体,大家都会想到ChildWindow,多熟悉的一个控件。不错,Sliverlight中已经提供了子窗体的具体实现,而在WPF中却没有这么好的事情(有的第三方控件商已经提供此控件)。最常见的实现方法就是在ViewModel中,直接New ChildWindow,然后直接Show。这样的方法也达到的要求。但是它不符合MVVM分层思想,再就是代码不美观,难以维护,今天我就给大家介绍一种美观又实用的方法。
原理
通过Prism中提供的InteractionRequestTrigger事件触发器,实现点击按钮或者用户的某种操作弹出对话框的效果。另外,不要忘了引用此命名空间:
using Microsoft.Practices.Prism.Interactivity.InteractionRequest;
创建ChildWindow窗体
<Window x:Class="ChildWindowDemo.ChildWindow.ChildWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"Width="300" Height="150" Title="{Binding Title}"x:Name="confirmationWindow" Topmost="True" WindowStyle="ToolWindow" WindowStartupLocation="CenterScreen"><Grid x:Name="LayoutRoot" Margin="2"><Grid.RowDefinitions><RowDefinition /><RowDefinition Height="Auto" /></Grid.RowDefinitions><ContentControl HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="0" Content="{Binding Content}"/><Button Content="Cancel" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,0,0" Grid.Row="1"><i:Interaction.Triggers><i:EventTrigger EventName="Click"><ei:CallMethodAction TargetObject="{Binding ElementName=confirmationWindow}" MethodName="Close"/></i:EventTrigger></i:Interaction.Triggers></Button><Button Content="OK" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,79,0" Grid.Row="1"><i:Interaction.Triggers><i:EventTrigger EventName="Click"><ei:ChangePropertyAction PropertyName="Confirmed" TargetObject="{Binding}" Value="True"/><ei:CallMethodAction TargetObject="{Binding ElementName=confirmationWindow}" MethodName="Close"/></i:EventTrigger></i:Interaction.Triggers></Button></Grid> </Window>
创建ChildWindow的基类
新建类:ChildWindowActionBase 并从TriggerAction<T>派生,代码如下:
public class ChildWindowActionBase : TriggerAction<FrameworkElement>{protected override void Invoke(object parameter){var arg = parameter as InteractionRequestedEventArgs;if (arg == null)return;var windows = this.GetChildWindow(arg.Context);var callback = arg.Callback;EventHandler handler = null;handler =(o, e) =>{windows.Closed -= handler;callback();};windows.Closed += handler;windows.ShowDialog();}Window GetChildWindow(Notification notification){var childWindow = this.CreateDefaultWindow(notification);childWindow.DataContext = notification;return childWindow;}Window CreateDefaultWindow(Notification notification){return (Window)new ChildWindow.ChildWindow();}}
到此子窗体已经完成
如何调用
主程序界面代码如下:
<Window x:Class="ChildWindowDemo.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:prism="http://www.codeplex.com/prism"xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"xmlns:local="clr-namespace:ChildWindowDemo"Title="MainWindow" Height="200" Width="300"><i:Interaction.Triggers><prism:InteractionRequestTrigger SourceObject="{Binding ConfirmationRequest, Mode=OneWay}"><local:ChildWindowActionBase/></prism:InteractionRequestTrigger></i:Interaction.Triggers><Grid><Button Command="{Binding RaiseConfirmation}" Content="Click Me !" HorizontalAlignment="Left" Margin="29,31,0,0" VerticalAlignment="Top" Width="217" Height="55"/><TextBlock HorizontalAlignment="Left" Margin="29,106,0,0" TextWrapping="Wrap" Text="{Binding ConfirmationResult}" VerticalAlignment="Top"/></Grid> </Window>
对之对应的ViewModel:
public class MainWindowViewModel : NotificationObject{public MainWindowViewModel(){this.RaiseConfirmation = new DelegateCommand(this.OnRaiseConfirmation);this.ConfirmationRequest = new InteractionRequest<Confirmation>();}public InteractionRequest<Confirmation> ConfirmationRequest { get; private set; }public DelegateCommand RaiseConfirmation { get; private set; }private string result;public string ConfirmationResult{get { return result; }set{result = value;this.RaisePropertyChanged(() => this.ConfirmationResult);}}private void OnRaiseConfirmation(){this.ConfirmationRequest.Raise(new Confirmation { Content = "是否确认", Title = "子窗体" },(cb) => { ConfirmationResult = cb.Confirmed ? "确认" : "取消"; });} }
总结
这样的写法比较符合MVVM的分层思想,子窗体可以随心定制,而不需要去改逻辑层的代码。具体代码以上全部提供,谢谢。
转载于:https://www.cnblogs.com/sunthx/p/3539900.html
[Prism框架实用分享]如何在主程序中合理的弹出子窗体相关推荐
- js layui 弹出子窗体_Layui中JS实现弹出层的应用
点我 //弹出一个页面层 var oBtn = document.getElementById('tab_1'); oBtn.onclick = function (){ layer.open({ t ...
- java鼠标右击出现选择窗口_java菜单代码 java中鼠标右击弹出菜单怎样实现
帮忙给一个java菜单栏例子的源代码 给你个小例子,已经添加注释了.自己运行下看看效果,满意的话记得结贴子. import java.awt.BorderLayout; import java.awt ...
- 如何在WordPress中创建优惠券弹出窗口(逐步)
Do you want to create a coupon popup in WordPress? Coupon popups are a great way to convert your web ...
- iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案
iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案 参考文章: (1)iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案 (2)https://www.cn ...
- iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案—scrollIntoView()
iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案-scrollIntoView() 参考文章: (1)iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案- ...
- Angular2项目中浏览器拦截弹出窗口的解决方法
Angular2项目中浏览器拦截弹出窗口的解决方法 为什么把项目是Angular2的放到了前边? 因为正常也页面网上已经很多解决方案.请自行百度或Google. 现象:当window.open为用户触 ...
- ASP.NET中WEB上弹出消息框的N种方法(为了以后方便,转了很多网友的文章!希望不会介意)...
ASP.NET中WEB上弹出消息框的N种方法 第一个确定之后跳转到另一页面,第二个确定之后返回前一页 Response.Write("<script langage='javascri ...
- Android中EditText优先弹出数字输入法
Android Android中EditText优先弹出数字输入法 项目中一个EditText输入数字的频率较高,但是汉字和英文的输入也偶有需要,直接在xml文件将inputType设置为number ...
- 解决微信小程序IOS中使用picker弹出内容和手机软键盘重叠的问题
解决微信小程序IOS中使用picker弹出内容和手机软键盘重叠的问题 项目需求: 一个信息提交页面:有input输入框,有picker选择器 遇到的问题: 点击input输入框时,手机自动弹出键盘,但 ...
最新文章
- 关于开发自我训练课程
- mvc html.antiforgerytoken,MVC Html.AntiForgeryToken() 防止CSRF***
- Java BigDecimal floatValue()方法与示例
- linux 下的sar工具命令小结
- js Maximum call stack size exceeded
- 设置windows服务依赖项
- java计算器流程图_我的第一个JAVA程序之计算器
- 小米图标大小设置方法_miui12如何设置图标大小
- ENVI学习总结——基于改进的 CASA 模型反演NPP
- macOS | 提取BDrip(封装格式为mkv)中视频与音频并重新封装为mp4
- java全栈开发工程师面试题总结
- python等比例压缩图片_python使用pil进行图像处理(等比例压缩、裁剪)实例代码
- 一键seo提交收录_做SEO优化长尾关键词排名你需要这些网站收录提交入口资源
- codeblocks的下载、安装与创建
- pytorch Vocab
- 渗透tools之POC-bomber
- msgbox函数和inputbox函数应该注意的几点
- 5.4节呈献:HP-Socket v5.3.1 发布 — 支持 Android NDK
- 【PSO】量子粒子群算法(QPSO)
- 【快速统计面积周长】封闭图形快速面积求和CAD插件【LSP】
热门文章
- Elasticsearch SQL插件
- C语言 VS输入输出字符设置
- 1.3 更多边缘检测内容
- C语言 mallocfree
- CentOS7设置环境变量
- VMware VMFS文件系统元数据不一致问题处理
- 消息中间件学习总结(3)——RocketMQ之十分钟入门RocketMQ
- Docker学习总结(37)——Dockerfile编写的八条准则
- html的设置语言为en,CSS中的html [lang =“ en”]和html:lang(en)有什么区别?
- 从C# 3.0到F#