原文: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. D3——根据数据画图

    为DOM元素添加class .attr("class", "bar") //为元素添加class属性,<div class="bar" ...

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

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

  3. Vue组件绑定自定义事件

    Vue组件使用v-on绑定自定义事件: 可以分为3步理解: 1.在组件模板中按照正常事件机制绑定事件: template: '<button v-on:click="increment ...

  4. git及github配置入门

    github是一个有海量开源代码库的网站,同时也是一个软件开发管理软件,作为软件来说它集成了git这个分布式的版本控制系统,可以上传.下载和管理自己的代码. 笔者刚接触不久,把认为入门应该知道的东西稍 ...

  5. DataGrid添加滚动条

    DataGrid中是没有滚动条的,要添加滚动条需要借助<div>层 <div style="overflow:auto;width:95%;height:95%" ...

  6. 第六章.MyBatis缓存结构

    一级缓存 测试案例: MyBatisTest.java //缓存 @Test public void testFindCustomerCache1() throws Exception{ SqlSes ...

  7. GIS中的空间参考

    GIS一般都是研究的基于地球的某个区域,例如一个国家.省或市的情况,既然地球上都有经纬度来标识,那么直接用经纬度来标识物体的位置不可以吗?但如果应用不一样,在实际中选择的空间参考系也是不一样的.例如我 ...

  8. javascript-数字转罗马数字

    阿拉伯数字与罗马数字转换 罗马数字表示 XXI, 21 个位数举例I, 1 ]II, 2] III, 3] IV, 4 ]V, 5 ]VI, 6] VII, 7] VIII,8 ]IX, 9 ·十位数 ...

  9. Server.xml解析

    来源 本文整理自 <Tomcat内核设计剖析>.<Tomcat结构解析> 加上自己的理解.源码来自 Tomcat8.5 版本 <Server port="800 ...

  10. 关于readonly的一些说明

    readonly在代码中只能在字段初始化器和构造函数中赋值,并不是说readonly只能赋值一次,超出这个范围以后readonly就不能通过代码修改了,但是还是可以用反射来修改,readonly仅仅是 ...