插件规范
# 前言📃
由于微软对于WindowsApps
文件夹的限制,导致打包版应用(appx/msix打包版)无法修改自身安装文件夹
这对于插件系统的ms-appx://
识别存在重大影响
所以该插件模式你需要遵守一些要求来使得插件正常运行
你需要遵循以下四个要求
- Page 或 UserControl (opens new window)
- Xaml 资源字典 (opens new window)
- Assets 资源文件 (opens new window)
- Resw 本地化 (opens new window)
- 插件元数据 (opens new window)
# Page或UserControl
创建新的Page或者用户控件的时候
会自动生成一个构造函数
(以LoginTip
为例子)
public LoginTip()
{
InitializeComponent();
}
2
3
4
但是在插件中InitializeComponent()
无法正常加载
所以我们要改为
using CustomExtensions.WinUI;
public LoginTip()
{
this.LoadComponent(ref _contentLoaded);
}
2
3
4
5
这样就能正常识别插件的Xaml内容了 ⚠️请注意,插件中的每一个Page或者UserControl都要更改为这种形式,否则将无法加载
# Xaml 资源字典
一般来说,我们会将一些常用的Color
,Style
塞到一个theme.xaml
中
这个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>() }
};
2
3
4
这样会在插件加载进入本体的时候会自动合并到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')}" />
2
3
在这里我们引入了命名空间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>(),
};
2
3
4
5
BikaPlugin
即为你自己的插件主类,继承自PluginBase
# Resw 本地化
- 在代码中获取本地化字符串
using CustomExtensions.WinUI;
public static string GetString(string key)
{
var resourceManager = ApplicationExtensionHost.GetResourceMapForAssembly();
return resourceManager.GetValue(key).ValueAsString;
}
2
3
4
5
6
- 在Xaml中获取本地化字符串
在这里建议继承MarkupExtension
实现一个自己的本地化类(例子:BikaLocaleExtension (opens new window))
然后就可以在Xaml文件中使用
<TextBlock
xmlns:ex="using:ShadowViewer.Plugin.Bika.Extensions"
Text="{ex:BikaLocale Key=AboutDescription}" />
2
3
# 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
2
3
4
5
6
7
8
9
10
11
# 插件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[]