我有几个不同的应用程序,这会有所帮助,但为了一个具体的例子,让我们假设我有一个WinForms应用程序。
此应用程序使用ElementHost
个对象中的WPF控件。我现在想为所有WPF按钮(System.Windows.Controls.Button
)定义一个隐式样式,这样每个ElementHost
都不需要在资源字典中合并,也不需要每个Button
都明确指定风格。
我在哪里定义所说的风格?
我尝试在项目根目录中创建资源字典Themes\Generic.xaml
并指定
[assembly: ThemeInfo(
ResourceDictionaryLocation.None,
ResourceDictionaryLocation.SourceAssembly )]
AssemblyInfo.cs
中的。这不起作用,我认为那种样式只适用于在同一个程序集中定义的自定义控件,其中Button
在外部程序集中定义。
示例将隐式样式代码放在<Application.Resources>
中;但是,该节点是with-in App.xaml
,它(项目尚未开始作为WPF应用程序)不存在。是否可以添加App.xaml
或是否有其他地方可以放置<Application.Resources>
以便识别它们?
答案 0 :(得分:0)
我能够将WPF App.xaml博士的方法用于上一个答案中提到的工作。我向我的WPF用户控件程序集添加了一个新页面,该程序集由我的WinForms应用程序从托管控件加载。我从我加载所有相同资源的其他WPF客户端应用程序中复制了真正的App.xaml.cs。我将它的内容复制到这个新的“页面”中,根据需要更新名称空间和引用。我将EnsureApplicationResources静态方法添加到新的App.xaml.cs App类中。
看起来像这样:
public static void EnsureApplicationResources() {
if (Application.Current == null) {
// create the Application object
try {
new App() {
ShutdownMode = ShutdownMode.OnExplicitShutdown
};
}
catch (System.Exception ex) {
Debug.WriteLine(ex.ToString());
}
}
}
诀窍是找出调用它来实例化应用程序的正确位置。我的WinForms应用程序从几个地方启动WPF窗口,所以我的第一次尝试涉及从根窗口的构造函数中调用Ensure ...方法不起作用,因为实际上可能实例化了多个“根窗口”。它也没有可靠地处理WPF应用程序,因此当它尝试再次重新创建相同的应用程序时,它会随后抛出异常,即使Application.Current显示为null。
相反,我将它添加到WinForms应用程序中的启动例程中。我不在该项目中使用启动对象。相反,我选择Main()子例程给出的显式控件。顺便说一句,WinForms应用程序是在VB.NET中。
Public Module MyWinFormsApp
Public Sub Main()
MyWpfApp.App.EnsureApplicationResources()
Application.Run(New frmWinFormsMain())
System.Windows.Application.Current.Shutdown()
End Sub
End Module
这种方法非常有效。 WPF应用程序是在WinForms应用程序启动时创建的,当它关闭时会关闭,并且可以使用任何应用程序作用域资源到我的所有托管WPF控件,包括隐式样式等。