(一)搭建项目和登录模块

1.项目架构

image
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提供了添加模块和配置模块目录的方法
image

  • 每一个模块都必须有一个模块类用来管理整个模块
  • 创建登录模块,view和对于view model
  • 登录模块是要放到mainwindow的某个区域

3.定义区域及事件触发器

3.1 区域

  • 在share中特意开一个文件夹建一个类存放各种名称

image

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

image

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

image

3.2 设置窗体属性

WPF窗口属性

  • 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 登录模块注册

image

  • 把事件转换为命令,用事件触发器,为了符合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中注入模块管理器,添加模块。如果没有延迟加载就会已启动就加载

延迟加载可以提高启动效率

image

4.登录页图片背景的添加

  1. 背景图的添加
    image
  2. 图片要改成资源
    image
  3. 这里修改了UI为用户控件库,之前建错了
  4. 在样式文件夹中新建两个资源字典
    image
  • 图片资源
    image
  • 通用资源 MergedDictionaries是做一个合并
    image
  1. 在app.xaml中引用通用样式
    image
  2. 此时login view就可以引用背景图片了
    image
  3. 这里登录模块并没有引用UI模块,UI模块和登录模块都是shell的引用资源,shell在加载模块时候,可以把这些资源进行分配

5. 程序集与命名空间修改

修改程序集与命名空间是一件很繁琐的事情,很多地方都需要进行修改

  • 首先属性中可以直接修改名称
    image
  • 模块名要和他们保持一致
    image
  • 模块下每个类文件的命名空间修改
  • xaml文件的类文件不能遗漏
  • 有一些作为被引用的要在useing处修改
  • xaml中命名空间引用的也需要修改
  • 有的命名空间需要重新导入

为了可以预览application等模块的效果图,可以建一个wpf应用,引入UI和其他application模块。注意以后命名少用application开头的,因为application本身是一个类,容易有命名冲突。

6. 登录页面的设计

  1. gird比stackpanel计算更为复杂,性能更低
  2. Run 元素允许您使用 Span 元素的所有可用属性来设置字符串的样式,但是虽然 Span 元素可能包含其他内联元素,但 Run 元素可能只包含纯文本。(其实是行内块元素)
  3. 样式资源(为了统一字体等)
    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="&#xf170;">
                         <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>
posted @ 2023-11-22 15:54  huihui不会写代码  阅读(126)  评论(0)    收藏  举报