在WinForms中托管时将主题应用于WPF UserControl

时间:2016-06-27 16:40:27

标签: wpf winforms themes

我正在WinForms应用程序中托管WPF UserControl(实际上有几个)。

由于Win7(Aero),Win8(Aero2)和(我假设)Win10的默认主题之间的视觉差异,我试图指定最低公分母主题(Aero)并从那里定制我的UI,从而有希望避免任何操作系统主题问题。

我理解的问题有两个:1)没有System.Windows.Application对象,因为它托管在WinForms项目中,所以我必须创建一个和2)我必须指定我想要的主题使用。

第一点thanks to this Dr. Wpf blog post非常简单,可以使用EnsureWpfApplicationResources()方法解决(字符串被拆分,有助于提高可读性)

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        EnsureWpfApplicationResources();
        AssignWin7Theme();
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        Application.Run(new myWinForm());
    }

    static void EnsureWpfApplicationResources()
    {
        if (Wpf.Application.Current == null)
        {
            // create the wpf application object
            new Wpf.Application(); // autoassigns to Wpf.Application.Current
        }
    }

    static void AssignWin7Theme()
    {
        Uri uri = new Uri(
            "PresentationFramework.Aero;V4.0.0.0;" +
            "31bf3856ad364e35;component\\themes/aero.normalcolor.xaml",
            UriKind.Relative);

        Wpf.Application.Current.Resources.MergedDictionaries.Add(
            Wpf.Application.LoadComponent(uri) as Wpf.ResourceDictionary);
    }
}

this撰写的Eli Arbel博客文章中的AssignWin7Theme()给了我麻烦。代码运行正常(不会抛出异常)但我的控件外观在Win8上没有变化,以匹配我在Win7上看到的内容。我以为应该自动选择这个设置;我需要在每个控件的XAML中设置一个属性吗?我还有什么不对吗?

1 个答案:

答案 0 :(得分:0)

你应该使用UriKind.Relative而不是绝对的。奇怪的是它不会抛出。

还要注意版本。如果您使用的是.NET 4.x,则应为V4.0.0.0