我有一个用WPF编写的Wix Managed Bootstrapper应用程序。
经过一定的更改后,引导程序不再起作用:当我在没有Bootstrapper的情况下运行WPF项目时,它运行正常(UI至少显示)。但是当我运行Bootstrapper本身时,它会打开一个空的(黑色背景)窗口,它只是坐在那里,什么都不做。
突破性变化似乎正在将主视图MainView.xaml
移动到View
子文件夹中。当然即使进行此更改,WPF项目本身仍可正常运行,但只是如上所述,Bootstrapper已被破坏。
我做了一些搜索,我能找到的最近的信息是http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/Visual-Styles-in-Wix-BA-td7584971.html,其中的建议包括:
1)使用pack://application:,,,
,即所有资源的绝对路径:我试过这个,但它没有解决我的问题
2)将额外的文件添加为Payload元素:这似乎只适用于非嵌入式资源,所以它不适用于我
3)将Application.ResourceAssembly = typeof(MainWindow).Assembly;
添加到Bootstrapper:我不知道这是做什么的,我不知道在哪里添加它所以我没有尝试过。
如何解决此问题?
其他信息:重大变化:我将我的MainView
XAML文件从WPF应用程序的根目录移动到名为View
的子文件夹。我将多个ResourceDictionary
个XAML文件从/View/
移到了/View/Dictionaries/
。我使用绝对路径来访问这些移动的XAML文件,例如:
<ResourceDictionary Source="WindowStyle.xaml" />
已更改为
<ResourceDictionary Source="/View/Dictionaries/WindowStyle.xaml" />
请注意,我使用的绝对路径以斜杠开头,但不以pack://application:,,,
开头。
图片资源:如果相关,我的所有图片都会放在Resources
文件夹中,其属性为Build action = Resource
和Copy to output directory = Do not copy
。我使用了这样的图像:
<Image Source="/Resources/logo.png" VerticalAlignment="Center" Width="75" Height="25" />
答案 0 :(得分:1)
Application.ResourceAssembly
(ManagedBootstrapperApplicationHost是一个托管.NET和WPF程序集的非托管应用程序。)
您可以尽快调用它,即在BootstrapperApplication
的无参数构造函数中,其中MainWindow
是DLL中包含嵌入资源的类型。这允许您使用pack://application:,,,
样式引用。
public class MyBA : BootstrapperApplication
{
public MyBA()
{
if (Application.ResourceAssembly == null)
{
Application.ResourceAssembly = typeof(MainWindow).Assembly;
}
}
}
答案 1 :(得分:0)
在我的问题中,解决方案与建议1)相反。换句话说,我不得不在我的XAML中使用相对路径而不是绝对路径。 Wix BS必须移动东西,所以绝对路径不起作用,但是相对路径会起作用,因为移动的所有东西将一起移动并且仍然处于相同的相对位置。