(一)搭建项目和登录模块
1.项目架构

UI也是用户控件库
Application每个模块都要设置生成后命令
xcopy "$(ProjectDir)\bin\Debug\$(ProjectName).dll" "$(SolutionDir)\Shell\bin\Debug\Modules\" /Y /S
xcopy "$(ProjectDir)\bin\Release\$(ProjectName).dll" "$(SolutionDir)\Shell\bin\Release\Modules\" /Y /S
把编译后的dll文件复制到shell的debug和release中
2.配置模块目录
2.1 重写方法
PrismApplication提供了添加模块和配置模块目录的方法

- 每一个模块都必须有一个模块类用来管理整个模块
- 创建登录模块,view和对于view model
- 登录模块是要放到mainwindow的某个区域
3.定义区域及事件触发器
3.1 区域
- 在share中特意开一个文件夹建一个类存放各种名称

- 在mainwindowview中添加命名空间后,通过ContentControl控件引入区域

- shell模块需要引入这些模块

3.2 设置窗体属性
- WindowStyle 指定窗口样式,有4个取值:
- None,无边框;(当ResizeMode属性为NoResize时,仅剩下窗口核心。)
- SingleBorderWindow,单边框【默认】;
- ThreeDBorderWindow,3D边框;
- ToolBorderWindow,工具箱窗口;
- ResizeMode 是指定大小调节样式,有4个取值:
- NoResize,不可调节,同时没有最大最小按钮;
- CanMinimize,不可调节。但可以最小化;(此时最大化按钮不可用)
- CanResize,可调节【默认】;
- CanResizeWithGrid,可根据网格调节;(窗口右下脚显示可调节网格)
- WindowStartLocation 指定窗口初始位置,有3个取值:
- Manual,手工指定位置,表示可以通过设置其Top、Left属性值
- CenterScreen,屏幕中央;
- CenterOwner,父窗体中央;
- SnapsToDevicePixels是WPF中的一个属性,用于控制UI元素是否应对设备像素进行对齐。
- AllowsTransparency属性是一个布尔值属性,用于指示窗口是否允许透明度。需要注意的是,当AllowsTransparency属性为True时,窗口的Style属性应设置为None,以便正确地呈现窗口的透明度。
如果设置为True,则窗口可以是半透明的,即可以设置窗口的不透明度。 当AllowsTransparency属性为True时,Window窗口可以使用Opacity属性来设置窗口的不透明度。Opacity属性是一个0到1之间的double值,其中0表示完全透明,1表示完全不透明。可以通过调整Opacity属性的值来实现窗口的淡入淡出效果。
3.3 WindowChrome
https://www.cnblogs.com/cdaniu/p/16875714.html
<WindowChrome.WindowChrome>
<WindowChrome GlassFrameThickness="0"
NonClientFrameEdges="None"
UseAeroCaptionButtons="False"
CornerRadius="3"/>
</WindowChrome.WindowChrome>
WindowChrome
设置了窗体效果
3.4 特性[module]
- 模块名
- 是否延迟加载
- ModuleName也可以在share中封装
[Module(ModuleName = ModuleNames.ApplicationLoginModule, OnDemand = true)]//OnDemand是否延迟加载
3.5 登录模块注册

- 把事件转换为命令,用事件触发器,为了符合MVVM框架
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding LoadedCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
- 当窗体加载完成时会执行loaded方法,但是我们已经把它转换成命令,所以此时会执行view model中的命令。
- 当实例化view model时,会传入IRegionManager,区域管理器,然后主窗口就可以实现导航功能。
- 加载登录模块的时候就会加载登录模块类,类中已经注册的登录页面(注册到容器中)此处便可以直接拿到
![image]()
- 如果有延迟加载登录模块就需要在mainwindowviewmodel中注入模块管理器,添加模块。如果没有延迟加载就会已启动就加载
延迟加载可以提高启动效率

4.登录页图片背景的添加
- 背景图的添加
![image]()
- 图片要改成资源
![image]()
- 这里修改了UI为用户控件库,之前建错了
- 在样式文件夹中新建两个资源字典
![image]()
- 图片资源
![image]()
- 通用资源 MergedDictionaries是做一个合并
![image]()
- 在app.xaml中引用通用样式
![image]()
- 此时login view就可以引用背景图片了
![image]()
- 这里登录模块并没有引用UI模块,UI模块和登录模块都是shell的引用资源,shell在加载模块时候,可以把这些资源进行分配
5. 程序集与命名空间修改
修改程序集与命名空间是一件很繁琐的事情,很多地方都需要进行修改
- 首先属性中可以直接修改名称
![image]()
- 模块名要和他们保持一致
![image]()
- 模块下每个类文件的命名空间修改
- xaml文件的类文件不能遗漏
- 有一些作为被引用的要在useing处修改
- xaml中命名空间引用的也需要修改
- 有的命名空间需要重新导入
为了可以预览application等模块的效果图,可以建一个wpf应用,引入UI和其他application模块。注意以后命名少用application开头的,因为application本身是一个类,容易有命名冲突。
6. 登录页面的设计
- gird比stackpanel计算更为复杂,性能更低
- Run 元素允许您使用 Span 元素的所有可用属性来设置字符串的样式,但是虽然 Span 元素可能包含其他内联元素,但 Run 元素可能只包含纯文本。(其实是行内块元素)
- 样式资源(为了统一字体等)
![image]()
- MahApps是一个主题包
- 在通用资源字典中都需要添加合并
![image]()
- 然后重新生成即可以看到效果
详细设计代码
<Border
Margin="1"
Background="White"
CornerRadius="1">
<Grid Background="Transparent">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="6.5*" />
<ColumnDefinition Width="3.5*" />
</Grid.ColumnDefinitions>
<Grid Grid.Column="0">
<Grid.Background>
<ImageBrush ImageSource="{StaticResource Image_LoginBP}" />
</Grid.Background>
<Grid Margin="60" VerticalAlignment="Center">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<TextBlock
Grid.Row="0"
HorizontalAlignment="Right"
VerticalAlignment="Center"
FontSize="50"
Foreground="#BF8F4B"
Text="huihui上位机控制系统" />
<TextBlock
Grid.Row="1"
HorizontalAlignment="Right"
d:Foreground="Red"
Foreground="White">
<Run Text="程序版本" />
<Run Text="{Binding Version, Mode=OneTime}" />
<Run Text="最佳分辨率:1920*1080" />
</TextBlock>
</Grid>
</Grid>
<Grid Grid.Column="1">
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<StackPanel>
<TextBlock
HorizontalAlignment="Center"
FontFamily="{StaticResource FontAwesome}"
FontSize="48"
Text="">
<TextBlock.Foreground>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Offset="0" Color="#7B2ED9" />
<GradientStop Offset="1" Color="#5485FF" />
</LinearGradientBrush>
</TextBlock.Foreground>
</TextBlock>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock
VerticalAlignment="Center"
Text="用户" />
<TextBox
Width="200"
Height="30"
Margin="5"
Text="{Binding CurrentUser.UserName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock
VerticalAlignment="Center"
Text="密码" />
<TextBox
Width="200"
Height="30"
Margin="5"
Text="{Binding CurrentUser.Password, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0 10 0 10">
<CheckBox Content="记住密码" Margin="32 10 5 5"/>
<CheckBox Content="自动登录" Margin="40 10 5 5"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<Button Content="登录" Width="200" Height="30" Margin="32 10 0 10" />
</StackPanel>
</StackPanel>
</Grid>
</Grid>
</Border>














浙公网安备 33010602011771号