(二)主模块和初始化模块的初搭建
1.创建用户
- 在share模块创建用户实体类,标注实现通知更新
![image]()
2. 登录模块业务层
- 前台绑定数据和命令
- 登录时的验证
![image]()
- 验证通过之后需要跳转页面
- 通过prism的事件管理器,通过事件订阅发布实现
- 验证通过后发布登录成功的事件
- LoginSuccessEvent继承于PubSubEvent为了传递CurrentUser这个泛型参数
![image]()
- 定义了一个管理事件发布和订阅的类。
![image]()
- 传递给订阅者的信息
![image]()
- 在mainwindowviewmodel的loadwindow方法中,切换到登录页面后,订阅登录成功的事件
- 登录成功的回调函数
- 先加载初始化模块
先创建初始化模块,模块管理类标注延迟加载,并且注册初始化页面到容器
![image]()
- 然后导航到初始化页面
![image]()
- 先加载初始化模块
3. 初始化界面
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>













浙公网安备 33010602011771号