(二)主模块和初始化模块的初搭建

1.创建用户

  • 在share模块创建用户实体类,标注实现通知更新
    image

2. 登录模块业务层

  • 前台绑定数据和命令
  • 登录时的验证
    image
  • 验证通过之后需要跳转页面
  • 通过prism的事件管理器,通过事件订阅发布实现
  • 验证通过后发布登录成功的事件
  • LoginSuccessEvent继承于PubSubEvent为了传递CurrentUser这个泛型参数
    image
  • 定义了一个管理事件发布和订阅的类。
    image
  • 传递给订阅者的信息
    image
  • 在mainwindowviewmodel的loadwindow方法中,切换到登录页面后,订阅登录成功的事件
  • 登录成功的回调函数
    • 先加载初始化模块
      先创建初始化模块,模块管理类标注延迟加载,并且注册初始化页面到容器
      image
    • 然后导航到初始化页面
      image

3. 初始化界面

WPF线性渐变和径向渐变

WPF线性渐变和径向渐变

    <UserControl.Background>
        <RadialGradientBrush GradientOrigin="0.5,0.5" Opacity="0.35" RadiusX="0.5" RadiusY="0.5">
            <GradientStop Offset="0" Color="#023A55" />
            <GradientStop Offset="0.25" Color="#135720" />
            <GradientStop Offset="0.75" Color="#214252" />
            <GradientStop Offset="1" Color="#1579A9" />
        </RadialGradientBrush>
    </UserControl.Background>
    <Grid>
        <Grid.Background>
            <LinearGradientBrush Opacity="0.65" StartPoint="0,0" EndPoint="1,1">
                <GradientStop Offset="0" Color="#7b2ed9" />
                <GradientStop Offset="1" Color="#5485ff" />
            </LinearGradientBrush>
        </Grid.Background>
        <StackPanel
            HorizontalAlignment="Center"
            VerticalAlignment="Center"
            Orientation="Horizontal">
            <TextBlock
                FontSize="18"
                Foreground="White"
                Text="{Binding Messgae}"
                TextWrapping="Wrap" />
            <mah:MetroProgressBar
                Width="250"
                Margin="4"
                Foreground="White"
                IsIndeterminate="True" />
            <Button
                Height="30"
                MinWidth="60"
                Margin="4"
                Content="重试"
                FontSize="14" 
                Command="{Binding EnterCommand}"/>
            <Button
                Height="30"
                MinWidth="60"
                Margin="4"
                Content="跳过"
                FontSize="14"
                Command="{Binding InitCommand}"/>
        </StackPanel>
    </Grid>

4. main模块大致创建

  • view
  • view model
  • 模块管理类,注册页面,按需加载
    image

5.硬件生命周期管理器

  • 创建一个硬件初始化的通知结果类
    image
  • 硬件初始化完成的事件
    image
  • 创建硬件生命周期管理器
 public class HardwareManager
 {
     /// <summary>
     /// 表示是否所以硬件加载成功
     /// </summary>
     public bool Initialized {  get; set; }
     public IEventAggregator EventAggregator { get; }

     public HardwareManager(IEventAggregator eventAggregator)
     {
         EventAggregator = eventAggregator;
     }

     public async Task<HardwareInitializeResult> InitAsync()
     {
         if(Initialized)
         {
             throw new Exception("重复初始化硬件");
         }
         await Task.Delay(2000);
         Initialized = true;
         EventAggregator.GetEvent<InitializedSuccessEvent>().Publish();//硬件初始化完成的事件发布

         return new HardwareInitializeResult() { Message="硬件初始化完成",Success=true};
     }
 }
  • 在mainwindow处订阅事件
    image
    加载完成直接跳到主界面
    加载未完成跳到初始化界面

6. 初始化页面的业务逻辑

  • 重试和跳过的业务逻辑
  • 按钮的显示和隐藏
  • 信息的绑定
 public class InitializeViewModel:ReactiveObject
 {
     public ICommand InitCommand { get; }
     public ICommand EnterCommand { get; }
     public IModuleManager ModuleManager { get; }
     public IRegionManager RegionManager { get; }
     public IEventAggregator EventAggregator { get; }
     /// <summary>
     /// 按钮默认隐藏
     /// </summary>
     [Reactive]
     public Visibility ButtonVisbility {  get; set; }=Visibility.Collapsed;

     private HardwareManager hardwareManager;
     /// <summary>
     /// 前端页面显示的加载信息
     /// </summary>
     [Reactive]
     public string Message {  get; set; }=string.Empty;
     public InitializeViewModel(IModuleManager moduleManager,IRegionManager regionManager,IEventAggregator eventAggregator)
     {
         InitCommand = ReactiveCommand.Create(InitAsyn);
         EnterCommand = ReactiveCommand.Create(EnterAsyn);
         ModuleManager = moduleManager;
         RegionManager = regionManager;
         EventAggregator = eventAggregator;
         hardwareManager = new HardwareManager(eventAggregator);
     }

     private async void EnterAsyn()
     {
         await Task.Delay(1000).ContinueWith(p =>
         {
             System.Windows.Application.Current.Dispatcher.Invoke(() =>
             {
                 //在UI线程进行模块加载和区域导航
                 ModuleManager.LoadModule(ModuleNames.ApplicationMainModule);
                 RegionManager.RequestNavigate(RegionNames.MainRegion, ViewNames.MainView);
             });
         });
     }

     private async  void InitAsyn()
     {
         ButtonVisbility = Visibility.Collapsed;
         if (!hardwareManager.Initialized)
         {
             Message = "正在初始化硬件";
             var result=await hardwareManager.InitAsync();
             if(!result.Success)
             {
                 Message=result.Message;
                 //初始化失败显示按钮
                 ButtonVisbility=Visibility.Visible;
                 return;
             }
         }

         Message = "初始化完成";
         //进入主模块
         EnterAsyn();
     }
 }

7. 主界面大致结构

 <Grid Background="Transparent">
     <Grid.RowDefinitions>
         <RowDefinition Height="auto"/>
         <RowDefinition />
     </Grid.RowDefinitions>
     <!--关闭最小化按钮-->
     <!--菜单栏-->
     <!--主体内容-->
     <Border Grid.Row="1" BorderBrush="#dde1f4" BorderThickness="1 0 1 1">
         <ContentControl prism:RegionManager.RegionName="{x:Static share:RegionNames.ContainerRegion}"/>
     </Border>
 </Grid>
posted @ 2023-11-23 13:35  huihui不会写代码  阅读(55)  评论(0)    收藏  举报