非WPF应用程序中的隐式WPF样式

时间:2012-12-18 22:53:13

标签: c# wpf styles

我有几个不同的应用程序,这会有所帮助,但为了一个具体的例子,让我们假设我有一个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>以便识别它们?

1 个答案:

答案 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控件,包括隐式样式等。