MercatorPelican permet la mise en place d'un nombre illimité de ToolKits sur mesure. Ces ToolKits reposent sur le concept de programmation Blazor Hybride .NET 10. Pour créer une nouveau ToolKit, il est possible de télécharger un exemple repris dans cette rubrique. Il est aussi possible de procéder au départ d'un nouveau projet de type "bibliothèque de classe" (class library) dans Visual Studio.
L'exemple est donné ici pour un projet multiplateforme. Dans un ToolKit, on ne doit distinguer que deux environnements :
- WinForm : pour Windows
- Core Only : qui sera utilisé pour Android, iOS, web IIS et web Linux
Il est recommandé de simplifier le projet si, au départ, on a connaissance qu'une plateforme ne sera jamais utilisée.
Voici le code par défaut d'un fichier csproj pour un projet de ToolKit :
<Project Sdk="Microsoft.NET.Sdk.Razor">
<PropertyGroup>
<Configurations>DebugCoreOnly;DebugWinforms;ReleaseCoreOnly;ReleaseWinforms</Configurations>
<ImplicitUsings>enable</ImplicitUsings>
<FileVersion>1.0.0.100</FileVersion>
<Version>1.0.0.0</Version>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)'=='DebugCoreOnly' Or '$(Configuration)'=='ReleaseCoreOnly'">
<TargetFramework>net10.0</TargetFramework>
<UseMaui>false</UseMaui>
<UseWindowsForms>false</UseWindowsForms>
<EnableDefaultCssItems>false</EnableDefaultCssItems>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)'=='DebugWinforms' Or '$(Configuration)'=='ReleaseWinforms'">
<TargetFramework>net10.0-windows</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)'=='DebugCoreOnly'">
<DefineConstants>TRACE;DEBUG;COREONLY</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)'=='ReleaseCoreOnly'">
<DefineConstants>TRACE;COREONLY</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)'=='DebugWinforms'">
<DefineConstants>TRACE;DEBUG;WINFORMS</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)'=='ReleaseWinforms'">
<DefineConstants>TRACE;WINFORMS</DefineConstants>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="$(NewtonsoftJsonVersion)" />
<PackageReference Include="Microsoft.Data.SqlClient" Version="$(MicrosoftDataSqlClientVersion)" />
</ItemGroup>
<PropertyGroup>
<SatelliteResourceLanguages>en;fr;nl;de</SatelliteResourceLanguages>
</PropertyGroup>
<ItemGroup Condition="'$(Configuration)'=='DebugCoreOnly' Or '$(Configuration)'=='ReleaseCoreOnly'">
<Reference Include="MercatorTunnel">
<HintPath>…\fw100CoreOnly\MercatorTunnel.dll</HintPath>
</Reference>
<Reference Include="MercatorUi">
<HintPath>…\fw100CoreOnly\MercatorUi.dll</HintPath>
</Reference>
<Reference Include="MercatorBlazorComponents">
<HintPath>…\fw100CoreOnly\MercatorBlazorComponents.dll</HintPath>
</Reference>
<Reference Include="MercatorPelican">
<HintPath>…\fw100CoreOnly\MercatorPelican.dll</HintPath>
</Reference>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
<ItemGroup Condition="'$(Configuration)'=='DebugWinforms' Or '$(Configuration)'=='ReleaseWinforms'">
<PackageReference Include="Microsoft.AspNetCore.Components.WebView.WindowsForms" Version="$(MicrosoftMauiControlsVersion)" />
<Reference Include="MercatorTunnel">
<HintPath>…\fw100Winforms\MercatorTunnel.dll</HintPath>
</Reference>
<Reference Include="MercatorUi">
<HintPath>…\fw100Winforms\MercatorUi.dll</HintPath>
</Reference>
<Reference Include="MercatorBlazorComponents">
<HintPath>…\fw100Winforms\MercatorBlazorComponents.dll</HintPath>
</Reference>
<Reference Include="MercatorPelican">
<HintPath>…\fw100Winforms\MercatorPelican.dll</HintPath>
</Reference>
</ItemGroup>
</Project>
⚠️ Les références vers les assemblies doivent correspondre aux plateformes. La compilation échouera si un mélange d'assemblies est constaté.
Les assemblies sont disponibles dans deux fichiers ZIP, à décompresser dans des répertoires distincts (par exemple fw100Winforms et fw100Coreonly), téléchargeables à partir de :
Le projet doit ensuite contenir au minimum ces trois fichiers :
1. _Imports.razor
@using System.Net.Http
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.JSInterop
@using MercatorPelican
@using MercatorBlazorComponents
2. ToolKit.razor
@inherits MercatorPelican.BaseClasses.ToolKitBase
@implements MercatorPelican.Interfaces.IToolKit
@* Ici votre markup Blazor *@
3. ToolKit.razor.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MercatorApi;
using MercatorExtensions;
using System.Data;
using Microsoft.JSInterop;
namespace ItemInfo
{
partial class ToolKit
{
public static MercatorPelican.ToolKitDescriptor Descriptor => new MercatorPelican.ToolKitDescriptor
{
TitleF = "Titre en français",
TitleN = "Titre en néerlandais",
TitleE = "Titre en anglais",
TitleD = "Titre en allemand",
DescriptionF = "Description en français",
DescriptionN = "Description en néerlandais",
DescriptionE = "Description en anglais",
DescriptionD = "Description en allemand",
BootstrapColums = MercatorPelican.ToolKitDescriptor.BootstrapColumsEnum.Sm12
};
public ToolKit()
{
Disposing += ToolKit_Disposing;
}
protected override void OnInitialized()
{
base.OnInitialized();
…
}
private void ToolKit_Disposing(object sender, EventArgs e)
{
Disposing -= ToolKit_Disposing;
…
}
}
}
Un ToolKit doit :
- Hériter de MercatorPelican.BaseClasses.ToolKitBase. Ceci offre notamment
- Une méthode overridable : ButtonPreviousClicked
- Un événement Disposing
- Implémenter l'interface MercatorPelican.Interfaces.IToolKit. Elle requiert la présence de ToolKitDescriptor Descriptor.
Cette classe ToolKitDescriptor permet de fixer différents paramètres propres au ToolKit :
- TitleF / N / E / D : titre en français, en néerlandais, en anglais et en allemand. Ce titre apparaît sur le bouton d'entrée vers ce ToolKit.
- DescriptionF / N / E / D : description, qui apparaît en plus petit dans ce même bouton.
- MercatorUiMainInstanceNeeded : l'instance de MercatorUi est-elle nécessaire pour ce ToolKit. A mettre à true par exemple si un engine est utilisé.
- MercatorReportingInitNeeded : si le paramètre précédent vaut true, faut-il aussi activer le moteur d'impression de Mercator.
- SettingsType : type d'une classe (par convention Settings) qui permet d'ajouter automatiquement des paramètres dans le fichier MercatorPelican.appsettings.json.
- BootstrapColums : permet de déterminer automatiquement la classe Bootstrap de la 4e div : col-sm-x col-sm-offset-y.
💡 Si on souhaite que les 4 div standards soient neutralisées et ne pas utiliser la présentation bootstrap, il faut placer ce code dans le ToolKit :
protected override void OnInitialized()
{
base.OnInitialized();
MercatorPelican.Globals.ShowToolKitPage.ChangeDivClass(divContentClass: "", divContentStartClass: "", divContainerClass: "", ignoreBootstrapColums: true);
} ShowToolKitPage est le composant razor qui héberge votre ToolKit.
La compilation du projet devra être effectuée deux fois :
- Une fois en choisissant dans le sélecteur de configurations DebugWinforms ou ReleaseWinforms : cela produira l'assembly pour Windows dans \bin\DebugWinforms ou \bin\ReleaseWinforms ;
- La seconde fois en sélectionnant DebugCoreOnly ou ReleaseCoreOnly : cela produira l'assembly pour les autres plateformes dans \bin\DebugCoreOnly ou \bin\ReleaseCoreOnly.
Les assemblies ainsi produites sont mises à disposition de MercatorPelican en les plaçant dans les fichiers SQL / Autres du Mercator associé, dans un répertoire MercatorPelican, avec deux sous-répertoires CoreOnly et Winforms. Les sous-répertoires fr, nl, … reprendront les éventuelles assemblies satellites contenant les ressources selon les langues.

💡 Les autres DLL ne doivent pas être placées dans les fichiers SQL. MercatorPelican en dispose déjà car il partage les mêmes références.
Une fois un ToolKit rendu disponible de cette manière, il suffit d'indiquer à MercatorPelican qu'il doit le charger. Cela se fait via son fichier MercatorPelican.appsettings.json.
"ToolKits": "MyToolkit1,MyToolkit2",