【问题标题】:Applying a Theme to a WPF UserControl When Hosted in WinForms在 WinForms 中托管时将主题应用于 WPF 用户控件
【发布时间】:2016-10-29 18:30:38
【问题描述】:

我在 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);
    }
}

AssignWin7Theme() 是我从 Eli Arbelthis 博客文章中派生出来的,这给我带来了麻烦。代码运行良好(不会引发异常),但我的控件的外观在 Win8 上没有改变,以匹配我在 Win7 上看到的。我认为它应该自动选择这个设置;我需要在每个控件的 XAML 中设置一个属性吗?我在这里还有什么问题吗?

【问题讨论】:

    标签: wpf winforms themes


    【解决方案1】:

    您应该使用UriKind.Relative 而不是绝对的。不扔就奇怪了。

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

    【讨论】:

    • 更新了版本 - UriKind.Relative 是一个复制/粘贴错误 - 它确实抛出了,我在这篇文章之后发现了它。在我的 Win8/Win10 机器上仍然没有看到 Win7 Aero 模板。
    • @ScottSEA 这绝对有效,我在我的机器上试过。不知道为什么它不适合你。我能想到的唯一另一件事是使用this hack - 它 hack - 它使用私有反射。只需从帖子中获取ThemeManager 课程并致电ThemeManager.ChangeTheme("aero.normalcolor")
    • @ScottSEA 再强调一点——我强烈反对你走“强制主题”的道路。我知道来自一个编造了很多方法来做到这一点的人很奇怪,但那是在 Windows 2000/XP 和 Aero 之间进行选择的时期。这些天来,我肯定会与操作系统主题保持一致。为您的用户提供更一致的体验会更好。
    • “一致的体验”正是我试图通过这样做来实现的。我的应用在 win7 和 win8+ 上看起来不同(由于默认主题不同),所以我试图消除它。
    • Eli,你测试的怎么样了?
    猜你喜欢
    • 1970-01-01
    • 2012-03-27
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    相关资源
    最近更新 更多