Halcon学习笔记(3):WPF 框架搭建,MaterialDesign+Prism

前言

其实我更喜欢CommunityToolkit.mvvm+HandyControl。但是因为找工作,你不能去抗拒新事物。这里就当体验一下完整的流程好了。

环境

  • windows 11
  • .net core 8.0

Nuget安装

新建WPF 类库项目

新建项目的时候,添加WPF项目,新建完成之后将APP.xaml等文件删除



在属性里面改成类库

初始化Prism

详细过程看这个视频好了,这里就不再展开了。

WPF机器视觉项目实战(2024首发版) 客户端搭建:https://www.bilibili.com/video/BV14m411Z78V/?p=13&spm_id_from=pageDriver&vd_source=17cf6a5a912b0a39a628030a5814462c

App启动页初始化

PrismApplication:将StartupUri去掉

<prism:PrismApplication x:Class="MachineVision.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:MachineVision"
             xmlns:prism="http://prismlibrary.com/">
    <Application.Resources>
         
    </Application.Resources>
</prism:PrismApplication>

App.xaml.cs

using MachineVision.Views;
using Prism.DryIoc;
using Prism.Ioc;
using System.Configuration;
using System.Data;
using System.Windows;

namespace MachineVision
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : PrismApplication
    {
        protected override Window CreateShell()
        {
            return Container.Resolve<MainView>();
        }

        protected override void RegisterTypes(IContainerRegistry services)
        {

        }
    }

}

重写MainView

Ioc注入

这里要简单讲解一下Prism的声明周期了,有两种注入模式

/// <summary>
/// 创造时直接返回Window,但是这样就不能用IOC注入了
/// </summary>
/// <returns></returns>
protected override Window CreateShell()
{
    //return new MainView();
    return null;
}

/// <summary>
/// 在创造完之后获得Windows
/// </summary>
protected override void OnInitialized()
{
    var container = ContainerLocator.Container;
    var shell = container.Resolve<object>("MainView");
    if (shell is Window view)
    {
        //通过region容器重新注入Window
        var regionManager = container.Resolve<IRegionManager>();
        RegionManager.SetRegionManager(view, regionManager);
        RegionManager.UpdateRegions();

        //找到首页的导航,初始化首页
        if (view.DataContext is INavigationAware navigationAware)
        {
            navigationAware.OnNavigatedTo(null);
            App.Current.MainWindow = view;
        }
    }
    base.OnInitialized();
}

我们这里还是推荐使用第二种注入方式的,因为第二种注入方式可以得到IOC的对象。

主要每次都要重新生成一下解决方案,我不知道为什么我这里重新生成解决方案好像没什么效果

posted @ 2024-07-08 08:38  gclove2000  阅读(111)  评论(0编辑  收藏  举报