add:插件系统

This commit is contained in:
2026-04-05 14:06:49 +08:00
parent 069a478559
commit 1fca17d557
31 changed files with 3361 additions and 1438 deletions
+104
View File
@@ -0,0 +1,104 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows.Controls;
using InkCanvasForClass.PluginSdk;
namespace InkCanvasForClass.PluginHost
{
/// <summary>
/// 收集插件登记的菜单 / 工具栏 / 设置页,供宿主窗口在启动后统一挂载。
/// </summary>
public sealed class CollectingPluginRegistry : IPluginRegistry
{
private string _currentPluginId = "";
public string CurrentPluginId => _currentPluginId;
public ObservableCollection<MenuItemRegistration> MenuItems { get; } =
new ObservableCollection<MenuItemRegistration>();
public ObservableCollection<ToolbarButtonRegistration> ToolbarButtons { get; } =
new ObservableCollection<ToolbarButtonRegistration>();
public ObservableCollection<SettingsPageRegistration> SettingsPages { get; } =
new ObservableCollection<SettingsPageRegistration>();
public void SetCurrentPluginId(string pluginId)
{
_currentPluginId = pluginId ?? "";
}
public void RegisterMenuItem(string groupKey, MenuItem item)
{
if (item == null) return;
MenuItems.Add(new MenuItemRegistration(_currentPluginId, groupKey ?? "", item));
}
public void RegisterToolbarButton(Button button)
{
if (button == null) return;
ToolbarButtons.Add(new ToolbarButtonRegistration(_currentPluginId, button));
}
public void RegisterSettingsPage(string pageId, string displayName, Func<UserControl> createView)
{
if (string.IsNullOrWhiteSpace(pageId) || createView == null) return;
SettingsPages.Add(new SettingsPageRegistration(
_currentPluginId,
pageId,
displayName ?? pageId,
createView));
}
public void Clear()
{
MenuItems.Clear();
ToolbarButtons.Clear();
SettingsPages.Clear();
_currentPluginId = "";
}
}
public sealed class MenuItemRegistration
{
public MenuItemRegistration(string pluginId, string groupKey, MenuItem item)
{
PluginId = pluginId ?? "";
GroupKey = groupKey ?? "";
Item = item ?? throw new ArgumentNullException(nameof(item));
}
public string PluginId { get; }
public string GroupKey { get; }
public MenuItem Item { get; }
}
public sealed class ToolbarButtonRegistration
{
public ToolbarButtonRegistration(string pluginId, Button button)
{
PluginId = pluginId ?? "";
Button = button ?? throw new ArgumentNullException(nameof(button));
}
public string PluginId { get; }
public Button Button { get; }
}
public sealed class SettingsPageRegistration
{
public SettingsPageRegistration(string pluginId, string pageId, string displayName, Func<UserControl> createView)
{
PluginId = pluginId ?? "";
PageId = pageId ?? "";
DisplayName = displayName ?? "";
CreateView = createView ?? throw new ArgumentNullException(nameof(createView));
}
public string PluginId { get; }
public string PageId { get; }
public string DisplayName { get; }
public Func<UserControl> CreateView { get; }
}
}
+16
View File
@@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net472</TargetFramework>
<UseWPF>true</UseWPF>
<RootNamespace>InkCanvasForClass.PluginHost</RootNamespace>
<AssemblyName>InkCanvas.PluginHost</AssemblyName>
<LangVersion>7.3</LangVersion>
<Nullable>disable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\SDK\InkCanvas.PluginSdk.csproj" />
</ItemGroup>
</Project>