如何在 VSIX 项目中使用 WPF 自定义控件/样式库?

问题描述 投票:0回答:1

我有一个带有自定义向导的 vsix,我想使用 WPF 作为向导,我可以创建一个窗口并显示我的向导,现在我想使用包含在库/nuget 中的 Fluent WPF 样式:

https://github.com/InkoreStudios/UI.WPF.Modern

但我在使用这个库时遇到问题。在一个简单的 wpf 桌面应用程序中,我可以放置以下代码:

<ui:ThemeResources/>
<ui:XamlControlsResources/>

我可以使用流畅的样式/控件

现在由于 vsix 中没有 app.xaml 文件,我将此代码放入我的 Window.Resources

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ui:ThemeResources/>
            <ui:XamlControlsResources/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>

我得到了这个例外:

System.Windows.Markup.XamlParseException: 'Could not load file or assembly 'iNKORE.UI.WPF.Modern, PublicKeyToken=cd19e634b9706635' or one of its dependencies. The system cannot find the file specified.'

FileNotFoundException: Could not load file or assembly 'iNKORE.UI.WPF.Modern, PublicKeyToken=cd19e634b9706635' or one of its dependencies. The system cannot find the file specified.

我如何在我的 vsix 中使用这个库?消息说找不到该文件,但我可以在发布/调试文件夹中看到 *.dll,并且库是强命名程序集签名的。

c# .net wpf visual-studio vsix
1个回答
0
投票

将此行添加到包类的顶部:

[ProvideBindingPath]
public sealed class YOURPROJECTPackage : AsyncPackage

或者我们可以使用 AssemblyResolver:

    AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve;
    
    private Assembly OnAssemblyResolve(object sender, ResolveEventArgs args)
{
    string path = Assembly.GetExecutingAssembly().Location;
    path = Path.GetDirectoryName(path);

    if (args.Name.ToLower().Contains("iNKORE.UI.WPF.Modern") && !args.Name.ToLower().Contains("iNKORE.UI.WPF.Modern.Controls"))
    {
        path = Path.Combine(path, "iNKORE.UI.WPF.Modern.dll");
        Assembly ret = Assembly.LoadFrom(path);
        return ret;
    }
 if (args.Name.ToLower().Contains("iNKORE.UI.WPF.Modern.Controls"))
    {
        path = Path.Combine(path, "iNKORE.UI.WPF.Modern.Controls.dll");
        Assembly ret = Assembly.LoadFrom(path);
        return ret;
    }
    return null;
}
© www.soinside.com 2019 - 2024. All rights reserved.