大家好

说起子窗体,大家都会想到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框架实用分享]如何在主程序中合理的弹出子窗体相关推荐

  1. js layui 弹出子窗体_Layui中JS实现弹出层的应用

    点我 //弹出一个页面层 var oBtn = document.getElementById('tab_1'); oBtn.onclick = function (){ layer.open({ t ...

  2. java鼠标右击出现选择窗口_java菜单代码 java中鼠标右击弹出菜单怎样实现

    帮忙给一个java菜单栏例子的源代码 给你个小例子,已经添加注释了.自己运行下看看效果,满意的话记得结贴子. import java.awt.BorderLayout; import java.awt ...

  3. 如何在WordPress中创建优惠券弹出窗口(逐步)

    Do you want to create a coupon popup in WordPress? Coupon popups are a great way to convert your web ...

  4. iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案

    iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案 参考文章: (1)iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案 (2)https://www.cn ...

  5. iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案—scrollIntoView()

    iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案-scrollIntoView() 参考文章: (1)iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案- ...

  6. Angular2项目中浏览器拦截弹出窗口的解决方法

    Angular2项目中浏览器拦截弹出窗口的解决方法 为什么把项目是Angular2的放到了前边? 因为正常也页面网上已经很多解决方案.请自行百度或Google. 现象:当window.open为用户触 ...

  7. ASP.NET中WEB上弹出消息框的N种方法(为了以后方便,转了很多网友的文章!希望不会介意)...

    ASP.NET中WEB上弹出消息框的N种方法 第一个确定之后跳转到另一页面,第二个确定之后返回前一页 Response.Write("<script langage='javascri ...

  8. Android中EditText优先弹出数字输入法

    Android Android中EditText优先弹出数字输入法 项目中一个EditText输入数字的频率较高,但是汉字和英文的输入也偶有需要,直接在xml文件将inputType设置为number ...

  9. 解决微信小程序IOS中使用picker弹出内容和手机软键盘重叠的问题

    解决微信小程序IOS中使用picker弹出内容和手机软键盘重叠的问题 项目需求: 一个信息提交页面:有input输入框,有picker选择器 遇到的问题: 点击input输入框时,手机自动弹出键盘,但 ...

最新文章

  1. 关于开发自我训练课程
  2. mvc html.antiforgerytoken,MVC Html.AntiForgeryToken() 防止CSRF***
  3. Java BigDecimal floatValue()方法与示例
  4. linux 下的sar工具命令小结
  5. js Maximum call stack size exceeded
  6. 设置windows服务依赖项
  7. java计算器流程图_我的第一个JAVA程序之计算器
  8. 小米图标大小设置方法_miui12如何设置图标大小
  9. ENVI学习总结——基于改进的 CASA 模型反演NPP
  10. macOS | 提取BDrip(封装格式为mkv)中视频与音频并重新封装为mp4
  11. java全栈开发工程师面试题总结
  12. python等比例压缩图片_python使用pil进行图像处理(等比例压缩、裁剪)实例代码
  13. 一键seo提交收录_做SEO优化长尾关键词排名你需要这些网站收录提交入口资源
  14. codeblocks的下载、安装与创建
  15. pytorch Vocab
  16. 渗透tools之POC-bomber
  17. msgbox函数和inputbox函数应该注意的几点
  18. 5.4节呈献:HP-Socket v5.3.1 发布 — 支持 Android NDK
  19. 【PSO】量子粒子群算法(QPSO)
  20. 【快速统计面积周长】封闭图形快速面积求和CAD插件【LSP】

热门文章

  1. Elasticsearch SQL插件
  2. C语言 VS输入输出字符设置
  3. 1.3 更多边缘检测内容
  4. C语言 mallocfree
  5. CentOS7设置环境变量
  6. VMware VMFS文件系统元数据不一致问题处理
  7. 消息中间件学习总结(3)——RocketMQ之十分钟入门RocketMQ
  8. Docker学习总结(37)——Dockerfile编写的八条准则
  9. html的设置语言为en,CSS中的html [lang =“ en”]和html:lang(en)有什么区别?
  10. 从C# 3.0到F#