Skip to content

插件规范

Nacho edited this page Aug 16, 2023 · 9 revisions

前言📃

由于微软对于WindowsApps文件夹的限制,导致打包版应用(appx/msix打包版)无法修改自身安装文件夹
这对于插件系统的ms-appx://识别存在重大影响
所以该插件模式你需要遵守一些要求来使得插件正常运行

你需要遵循以下四个要求

Page或UserControl

创建新的Page或者用户控件的时候
会自动生成一个构造函数
(以LoginTip为例子)

public LoginTip()
{
    InitializeComponent();
}

但是在插件中InitializeComponent()无法正常加载
所以我们要改为

using CustomExtensions.WinUI;
public LoginTip()
{
     this.LoadComponent(ref _contentLoaded);
}

这样就能正常识别插件的Xaml内容了 ⚠️请注意,插件中的每一个Page或者UserControl都要更改为这种形式,否则将无法加载

Xaml 资源字典

一般来说,我们会将一些常用的Color,Style塞到一个theme.xaml
u751pv.png
这个theme.xaml内部是ResourceDictionary
正常项目中我们都会塞到App.xaml里,但是插件是没有App.xaml的,所以在PluginBase类中就实现了该功能

请用你自己的插件主类(比如我的是BikaPlugin)实现以下方法

public override IEnumerable<ResourceDictionary> ResourceDictionaries => new List<ResourceDictionary>
{
    new ResourceDictionary() { Source ="/Themes/BikaTheme.xaml".AssetUri<BikaPlugin>() }
};

这样会在插件加载进入本体的时候会自动合并到App.xaml

Assets 资源文件

针对Assets文件夹内的图片或者其他文件
将在一般WinUI3应用中采用的

<Image Source="ms-appx:///Assets/Picacgs/picacomic_2.png" /> <!-- 这是错误的 ->

改为

<Image 
  xmlns:ee="using:CustomExtensions.WinUI"
  Source="{x:Bind ee:WinUIExtensions.ImageSource('/Assets/Picacgs/picacomic_2.png')}" />

在这里我们引入了命名空间CustomExtensions.WinUI
然后使用静态方法WinUIExtensions.ImageSource将相对路径/Assets/Picacgs/picacomic_2.png修改为程序能够识别的路径
如果想要知道详细内容,请查看源码

⚠️这个方法只能在你自己的插件程序集中使用,如果想修改ShadowViewer本体或者其他程序集,请不要使用这个方法

如果你想使用代码:

using CustomExtensions.WinUI;
var image = new Image()
{
    Source = "/Assets/Picacgs/picacomic_2.png".ImageSource<BikaPlugin>(),
};

BikaPlugin即为你自己的插件主类,继承自PluginBase

Resw 本地化

kmctor.png

  • 在代码中获取本地化字符串
using CustomExtensions.WinUI;
public static string GetString(string key) 
{
    var resourceManager = ApplicationExtensionHost.GetResourceMapForAssembly();
    return resourceManager.GetValue(key).ValueAsString;
}
  • 在Xaml中获取本地化字符串

在这里建议继承MarkupExtension实现一个自己的本地化类(例子:BikaLocaleExtension)
然后就可以在Xaml文件中使用

<TextBlock 
   xmlns:ex="using:ShadowViewer.Plugin.Bika.Extensions"
   Text="{ex:BikaLocale Key=AboutDescription}" />

PluginMetaData 插件元数据

插件元数据是提供给应用本体读取的,所以对于任何插件来说都是必须的
插件元数据包含以下几项:

  • 插件ID(Id)
  • 插件名称(Name)
  • 插件介绍(Description)
  • 插件作者(Author)
  • 插件版本(Version)
  • 插件仓库地址(WebUri)
  • 插件图标(Logo)
  • 支持的插件管理器版本(MinVersion)
  • 支持的语言(Lang)
  • 依赖的插件ID(Require)

示例

[PluginMetaData("Bika",
    "哔咔漫画",
    "哔咔漫画适配器",
    "kitUIN", "0.1.0",
    "https://github.com/kitUIN/ShadowViewer.Plugin.Bika/",
    "ms-appx:///Assets/Icons/logo.png",
    20230808, 
    new []{"Local"},
    new []{"zh-CN"}
    )]
public partial class BikaPlugin : PluginBase

插件ID

大小写不敏感,建议为英文
⚠️这是插件的唯一标识符,请注意不要与别的插件重合了
type:string

插件名称

这是插件在应用中显示的名称
type:string

插件介绍

这是插件在应用中显示的介绍
type:string

插件版本

这是插件在应用中显示的版本
type:string

插件作者

这是插件在应用中显示的作者
type:string

插件仓库地址

这是插件在应用中允许跳转的仓库地址,请放入网络链接
type:string

插件图标

如果是本地文件,请以ms-appx:///{相对位置}开头
如果是FontIcon,请以font://{Glyph}开头
如果是FluentIcon,请以fluent://{Glyph}开头
type:string

支持的插件管理器版本

type:int

支持的语言

type:string[]

依赖的插件ID

type:string[]