原文:WPF Prism MVVM 中 弹出新窗体. 放入用户控件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37214567/article/details/79657338

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;
/// <summary>
/// 通过重写PopupWindowAction中的GetWindow方法,设置Window的Style属性。
/// 否则打开的只能是默认窗体,无法设置样式。
/// </summary>
/// <param name="notification"></param>
/// <returns></returns>
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;
} /// <summary>
/// 键盘按下 事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void WrapperWindow_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
//按下ESC 关闭窗口
if (e.Key == Key.Escape)
{
_wrapperWindow.Close();
} }
}
}

这里是上面代码 要加载的 样式 ( BorderlessWindow.xaml )

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Name="BorderlessWindowStyle"
TargetType="{x:Type Window}">
<Setter Property="FontFamily"
Value="{DynamicResource DefaultFontFamily}" />
<Setter Property="FontSize"
Value="{DynamicResource DefaultFontSize}" />
<Setter Property="Foreground"
Value="{DynamicResource WindowText}" />
<Setter Property="BorderBrush"
Value="{DynamicResource WindowBorder}" /> <Setter Property="ResizeMode"
Value="CanResizeWithGrip" />
<Setter Property="UseLayoutRounding"
Value="True" />
<Setter Property="TextOptions.TextFormattingMode"
Value="Display" /> <Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Window}">
<Border x:Name="WindowBorder"
Margin="{Binding Source={x:Static SystemParameters.WindowNonClientFrameThickness}}">
<Border.Background>
<SolidColorBrush x:Name="WindowBorderBackground"
Color="{DynamicResource WindowBackgroundColor}" />
</Border.Background>
<Border.Resources>
<Storyboard x:Key="BackgroundAnimation">
<ColorAnimation Storyboard.TargetName="WindowBorderBackground"
Storyboard.TargetProperty="Color"
To="{DynamicResource WindowBackgroundColor}"
Duration="0:0:.6" />
</Storyboard>
</Border.Resources> <Border BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="1">
<AdornerDecorator>
<Grid x:Name="LayoutRoot">
<Grid.RowDefinitions>
<RowDefinition Height="36" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions> <!-- title bar -->
<Grid>
<!-- title -->
<TextBlock Text="{TemplateBinding Title}"
Margin="8,0"
VerticalAlignment="Center"
Visibility="Visible" />
<!-- window system buttons-->
<StackPanel VerticalAlignment="Top"
HorizontalAlignment="Right"
WindowChrome.IsHitTestVisibleInChrome="True">
<Button Command="{Binding Source={x:Static SystemCommands.CloseWindowCommand}}"
ToolTip="关闭">
<Button.Content>
<Grid Width="13"
Height="12"
RenderTransform="1,0,0,1,0,1">
<Path Data="M0,0 L8,7 M8,0 L0,7 Z"
Width="8"
Height="7"
VerticalAlignment="Center"
HorizontalAlignment="Center"
Stroke="{Binding Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Button}}"
StrokeThickness="1.5" />
</Grid>
</Button.Content>
</Button>
</StackPanel>
</Grid> <Grid Grid.Row="1"
Height="30">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="42" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
</Grid>
<Grid Grid.Row="2">
<ContentPresenter />
</Grid>
</Grid>
</AdornerDecorator>
</Border>
</Border> <ControlTemplate.Triggers>
<Trigger Property="IsActive"
Value="True">
<Setter Property="BorderBrush"
Value="{DynamicResource WindowBorderActive}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter> <Setter Property="WindowChrome.WindowChrome">
<Setter.Value>
<WindowChrome CornerRadius="0"
GlassFrameThickness="1"
UseAeroCaptionButtons="False"
NonClientFrameEdges="None" />
</Setter.Value>
</Setter>
</Style>
<Color x:Key="WindowBackgroundColor">#ffffff</Color> <SolidColorBrush x:Key="ButtonBackground"
Color="#ffffff" />
<SolidColorBrush x:Key="ButtonBackgroundHover"
Color="#dddddd" />
<SolidColorBrush x:Key="ButtonBackgroundPressed"
Color="BlueViolet" />
<SolidColorBrush x:Key="ButtonBorder"
Color="#cccccc" />
<SolidColorBrush x:Key="ButtonBorderHover"
Color="#cccccc" />
<SolidColorBrush x:Key="ButtonBorderPressed"
Color="BlueViolet" />
<SolidColorBrush x:Key="ButtonText"
Color="#333333" />
<SolidColorBrush x:Key="ButtonTextHover"
Color="#333333" />
<SolidColorBrush x:Key="ButtonTextPressed"
Color="#ffffff" />
<SolidColorBrush x:Key="ButtonTextDisabled"
Color="#a1a1a1" /> <SolidColorBrush x:Key="DataGridBackground"
Color="Transparent" />
<SolidColorBrush x:Key="DataGridForeground"
Color="#333333" />
<SolidColorBrush x:Key="DataGridCellBackground"
Color="Transparent" />
<SolidColorBrush x:Key="DataGridCellBackgroundHover"
Color="#dddddd" />
<SolidColorBrush x:Key="DataGridCellBackgroundSelected"
Color="BlueViolet" />
<SolidColorBrush x:Key="DataGridCellForeground"
Color="#333333" />
<SolidColorBrush x:Key="DataGridCellForegroundHover"
Color="#333333" />
<SolidColorBrush x:Key="DataGridCellForegroundSelected"
Color="#ffffff" />
<SolidColorBrush x:Key="DataGridHeaderBackground"
Color="Transparent" />
<SolidColorBrush x:Key="DataGridHeaderBackgroundHover"
Color="#dddddd" />
<SolidColorBrush x:Key="DataGridHeaderBackgroundPressed"
Color="BlueViolet" />
<SolidColorBrush x:Key="DataGridHeaderBackgroundSelected"
Color="BlueViolet" />
<SolidColorBrush x:Key="DataGridHeaderForeground"
Color="#333333" />
<SolidColorBrush x:Key="DataGridHeaderForegroundHover"
Color="#333333" />
<SolidColorBrush x:Key="DataGridHeaderForegroundPressed"
Color="#ffffff" />
<SolidColorBrush x:Key="DataGridHeaderForegroundSelected"
Color="#ffffff" />
<SolidColorBrush x:Key="DataGridGridLines"
Color="#cccccc" />
<SolidColorBrush x:Key="DataGridDropSeparator"
Color="BlueViolet" /> <SolidColorBrush x:Key="Hyperlink"
Color="BlueViolet" />
<SolidColorBrush x:Key="HyperlinkHover"
Color="BlueViolet" />
<SolidColorBrush x:Key="HyperlinkDisabled"
Color="#919191" /> <SolidColorBrush x:Key="InputBackground"
Color="#ffffff" />
<SolidColorBrush x:Key="InputBackgroundHover"
Color="#ffffff" />
<SolidColorBrush x:Key="InputBorder"
Color="#cccccc" />
<SolidColorBrush x:Key="InputBorderHover"
Color="#cccccc" />
<SolidColorBrush x:Key="InputText"
Color="#333333" />
<SolidColorBrush x:Key="InputTextHover"
Color="#333333" />
<SolidColorBrush x:Key="InputTextDisabled"
Color="#919191" /> <SolidColorBrush x:Key="ItemBackgroundHover"
Color="#dddddd" />
<SolidColorBrush x:Key="ItemBackgroundSelected"
Color="BlueViolet" />
<SolidColorBrush x:Key="ItemBorder"
Color="#cccccc" />
<SolidColorBrush x:Key="ItemText"
Color="#333333" />
<SolidColorBrush x:Key="ItemTextSelected"
Color="#ffffff" />
<SolidColorBrush x:Key="ItemTextHover"
Color="#333333" />
<SolidColorBrush x:Key="ItemTextDisabled"
Color="#919191" /> <SolidColorBrush x:Key="LinkButtonText"
Color="#717171" />
<SolidColorBrush x:Key="LinkButtonTextHover"
Color="#333333" />
<SolidColorBrush x:Key="LinkButtonTextPressed"
Color="#919191" />
<SolidColorBrush x:Key="LinkButtonTextDisabled"
Color="#919191" /> <SolidColorBrush x:Key="MenuText"
Color="#66000000" />
<SolidColorBrush x:Key="MenuTextHover"
Color="#bb000000" />
<SolidColorBrush x:Key="MenuTextSelected"
Color="#333333" /> <SolidColorBrush x:Key="ModernButtonBorder"
Color="#919191" />
<SolidColorBrush x:Key="ModernButtonBorderHover"
Color="#333333" />
<SolidColorBrush x:Key="ModernButtonBorderPressed"
Color="#333333" />
<SolidColorBrush x:Key="ModernButtonBorderDisabled"
Color="#919191" />
<SolidColorBrush x:Key="ModernButtonIconBackgroundPressed"
Color="BlueViolet" />
<SolidColorBrush x:Key="ModernButtonIconForegroundPressed"
Color="#ffffff" />
<SolidColorBrush x:Key="ModernButtonText"
Color="#333333" />
<SolidColorBrush x:Key="ModernButtonTextHover"
Color="#333333" />
<SolidColorBrush x:Key="ModernButtonTextPressed"
Color="#333333" />
<SolidColorBrush x:Key="ModernButtonTextDisabled"
Color="#a1a1a1" /> <SolidColorBrush x:Key="PopupBackground"
Color="#ffffff" /> <SolidColorBrush x:Key="ProgressBackground"
Color="#dddddd" /> <SolidColorBrush x:Key="ScrollBarBackground"
Color="Transparent" />
<SolidColorBrush x:Key="ScrollBarThumbBackground"
Color="Transparent" />
<SolidColorBrush x:Key="ScrollBarThumbBackgroundDragging"
Color="#cccccc" />
<SolidColorBrush x:Key="ScrollBarThumbBackgroundHover"
Color="#dddddd" />
<SolidColorBrush x:Key="ScrollBarThumbBorder"
Color="#cccccc" />
<SolidColorBrush x:Key="ScrollBarThumbForeground"
Color="Transparent" />
<SolidColorBrush x:Key="ScrollBarThumbForegroundDragging"
Color="Transparent" />
<SolidColorBrush x:Key="ScrollBarThumbForegroundHover"
Color="Transparent" /> <SolidColorBrush x:Key="SeparatorBackground"
Color="#cccccc" /> <SolidColorBrush x:Key="SliderSelectionBackground"
Color="BlueViolet" />
<SolidColorBrush x:Key="SliderSelectionBorder"
Color="BlueViolet" />
<SolidColorBrush x:Key="SliderThumbBackground"
Color="#ffffff" />
<SolidColorBrush x:Key="SliderThumbBackgroundDragging"
Color="BlueViolet" />
<SolidColorBrush x:Key="SliderThumbBackgroundHover"
Color="#dddddd" />
<SolidColorBrush x:Key="SliderThumbBackgroundDisabled"
Color="#cccccc" />
<SolidColorBrush x:Key="SliderThumbBorder"
Color="#cccccc" />
<SolidColorBrush x:Key="SliderThumbBorderDragging"
Color="BlueViolet" />
<SolidColorBrush x:Key="SliderThumbBorderHover"
Color="#cccccc" />
<SolidColorBrush x:Key="SliderThumbBorderDisabled"
Color="#cccccc" />
<SolidColorBrush x:Key="SliderTrackBackground"
Color="#cccccc" />
<SolidColorBrush x:Key="SliderTrackBorder"
Color="#cccccc" />
<SolidColorBrush x:Key="SliderTick"
Color="#919191" />
<SolidColorBrush x:Key="SliderTickDisabled"
Color="#cccccc" /> <SolidColorBrush x:Key="SubMenuText"
Color="#99000000" />
<SolidColorBrush x:Key="SubMenuTextHover"
Color="#66000000" />
<SolidColorBrush x:Key="SubMenuTextSelected"
Color="#333333" /> <SolidColorBrush x:Key="WindowBackground"
Color="{StaticResource WindowBackgroundColor}" />
<SolidColorBrush x:Key="WindowBorder"
Color="BlueViolet"
Opacity=".5" />
<SolidColorBrush x:Key="WindowBorderActive"
Color="BlueViolet" />
<LinearGradientBrush x:Key="WindowHeaderGradient"
StartPoint="0, 0"
EndPoint="0, 1"
Opacity=".1">
<GradientStop Offset="0"
Color="BlueViolet" />
<GradientStop Offset=".3"
Color="BlueViolet" />
<GradientStop Offset="1"
Color="Transparent" />
</LinearGradientBrush>
<SolidColorBrush x:Key="WindowText"
Color="#333333" />
<SolidColorBrush x:Key="WindowTextReadOnly"
Color="#919191" /> <Rectangle x:Key="WindowBackgroundContent"
x:Shared="false"
Height="96"
Fill="{StaticResource WindowHeaderGradient}"
VerticalAlignment="Top" />
</ResourceDictionary>

二. 我们该怎么用它.

1.窗口的XAML

这里我们需要用到Triggers

2.窗口的 ViewModel

在这里我们需要引用命名空间 ,大家没有这个DLL的 可以在NuGet上搜索.安装就可以了.

3.这里是ViewModel的具体方法

  • 定义
  • 在构造参数中实例化
  • 传入Content和Title

4.要放入Window 中 的 用户控件 的ViewModel

5.用户控件的ViewModel 中的具体操作

  • 放入返回值
  • 关闭窗口

6.返回值的处理

注意:

  • 用户控件 在触发器那里指定的时候,要注意 防止出现死循环. 会报错…
  • 这只是其中一种解决方案… 可能不是最好的.

这些就是 这个 弹出窗体的 具体操作了. 也比较简单. 看不懂的 多看两遍. 然后 动手操作一下.

WPF Prism MVVM 中 弹出新窗体. 放入用户控件的更多相关文章

  1. 在ASP.NET中动态加载内容(用户控件和模板)

    在ASP.NET中动态加载内容(用户控件和模板) 要点: 1. 使用Page.ParseControl 2. 使用base.LoadControl 第一部分:加载模板 下 面是一个模板“<tab ...

  2. 在wpf窗体上添加用户控件

    1.引用用户控件的命名控件 xmlns:my="clr-namespace:WpfApplicationDemo.Control" 2.把用户控件添加到窗体中 <my:Use ...

  3. 【WPF学习笔记】之如何点击“新建”按钮,在面板中加载一条条的“用户控件”的信息:动画系列之(四)

    ...... 承接上一系列动画三. 在主界面后台代码设置嵌套第二个用户控件. using System; using System.Collections.Generic; using System. ...

  4. C#窗体程序【用户控件-窗体】委托事件

    这里的自定义控件是由普通控件组合而成的.希望事件响应代码推迟到使用自定义控件的窗体里写.步骤一:新建一个用户控件,放两个按钮,Tag分别是btn1,btn2.这两个按钮的共用单击事件处理代码如下: u ...

  5. C#中无边框窗体移动或拖控件移动窗体

    [DllImport("user32.dll")] public static extern bool ReleaseCapture(); [DllImport("use ...

  6. wpf的UserControl用户控件怎么添加到Window窗体中

    转载自 http://www.cnblogs.com/shuang121/archive/2013/01/09/2853591.html 我们来新建一个用户控件UserControl1.xaml &l ...

  7. 无边框窗体、用户控件、Timer控件

    一.无边框窗体1 最大化.最小化以及关闭按钮制作实际上就是更换点击前.指向时.点击时的图片 (1)将图片放在该文件夹的Debug中,获取图片的路径Application.StartupPath + & ...

  8. jQuery UI弹出新窗体

    借助jqueryUI 的Dialog 在隐藏的div中嵌入Iframe  改变iframe的路径 如果项目经常用到弹出新窗体,则利用模板,把此代码和html 放入父页面中,实现父级调用, <in ...

  9. CefSharp禁止弹出新窗体,在同一窗口打开链接,或者在新Tab页打开链接,并且支持带type="POST" target="_blank"的链接

    说明:在同一窗口打开链接,只要稍加改造就可以实现,这里实现的是在新Tab页打开链接,并且支持带type="POST" target="_blank"的链接 gi ...

随机推荐

  1. June 19th 2017 Week 25th Monday

    Everyone is dissatisfied with his own fortune. 人对自己的命运总是感到不满足. We always want more, even when we hav ...

  2. Geekforgeek week1

    1. is palindrome solution 1: check to reverse the digit, if they are the same number https://www.gee ...

  3. 035server端并发聊天

    import socketserver class MyServer(socketserver.BaseRequestHandler): def handle(self): # 里面是每个客户端连接执 ...

  4. 在Vue-cli项目中引入Bootstrap

    (1)到bootstrap官网下载所需版本的bootstrap.zip文件. (2)将bootstrap.min.css以及bootstrap.min.js解压到assets文件夹,另外还需要将fon ...

  5. css3实现 两个点之间有一条线,循环运动

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  6. JavaScript的DOM_其他的扩展

    一.呈现模式 从 IE6 开始开始区分标准模式和混杂模式(怪异模式),主要是看文档的声明. IE 为document 对象添加了一个名为 compatMode 属性,这个属性可以识别 IE 浏览器的文 ...

  7. Android进阶笔记14:3种JSON解析工具(org.json、fastjson、gson)

    一. 目前解析json有三种工具:org.json(Java常用的解析),fastjson(阿里巴巴工程师开发的),Gson(Google官网出的),其中解析速度最快的是Gson. 3种json工具下 ...

  8. django get_object_or_404

    django get_object_or_404 是django shortcuts模块里面一个比较简便的方法,特别是用django get来操作数据库的时候,可以帮 我们少写一些代码,加快开发速度. ...

  9. 人类主动探索地外文明(METI)活动正在进行中

                  请看下图:            这是位于俄罗斯克里米亚境内的行星际深空通讯雷达(口径70米,2-300GHz,建造于1978年)的外观.借助该雷达的强大发射功率,有关国际 ...

  10. 使用腾讯云mysql的一下小坑

    1. 数据库中标的命名,mybatis会给你全部转成驼峰命名,这样就会发现找不到数据库的表了.比如下面的,我在本地运行时ok, 表名称是t_blogtype,但是放到服务器就报错说找不到表. 2. 本 ...