在WinForms中托管时将主题应用于WPF用户控件



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

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

据我所知,问题有两个方面:1(没有System.Windows.Application对象,因为它托管在WinForms项目中,所以我必须创建一个对象;2(我必须指定要使用的主题。

第一点,感谢这个博士。Wpf博客文章,很简单,可以用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);
    }
}

我从Eli Arbel的这篇博客文章中得到的AssignWin7Theme()给我带来了麻烦。代码运行良好(不会引发异常(,但我的控件在Win8上的外观并没有改变,以匹配我在Win7上看到的内容。我以为它应该自动设置;我需要在每个控件的XAML中设置一个属性吗?我还做错了什么?

您应该使用UriKind.Relative,而不是绝对值。奇怪的是它不扔。

还要注意版本。如果你在.NET 4.x上,它应该是V4.0.0.0

相关内容

  • 没有找到相关文章

最新更新