gpt4 book ai didi

在 Visual Studio 2008 Designer 中工作的 WPF 皮肤库

转载 作者:行者123 更新时间:2023-12-02 08:26:35 25 4
gpt4 key购买 nike

在我们的项目中,我们的 View 和控件位于许多不同的程序集中(单个解决方案中有超过 40 个程序集,具有 100 个 View )。我们希望将皮肤应用于单个皮肤组件中的所有 View ,我们可以将其与不同的皮肤组件交换以应用不同的皮肤(不一定在运行时,这可以在编译时完成)并且只需要更改几行代码。更重要的是...我们希望它能够在 Visual Studio 2008 设计器中正确显示。

我们目前有一个运行时皮肤解决方案,通过将皮肤的主资源字典合并到 Application.Resources 中来应用正确的皮肤,但 Visual Studio 设计器不会在依赖程序集中的 View 上显示该皮肤。

我们可以将皮肤的资源字典合并到每个单独 View 的 Window.Resources 中,但这会影响性能,并且如果我们想要交换皮肤,则需要进行许多更改。

我研究了在主题级别应用样式,但要在主题级别使用样式,您需要指定一个 ComponentResourceKey,其中包含对主题程序集中类型的强类型引用。这需要每个 View 指定皮肤所在的命名空间,这又将是交换皮肤的主要重构。

还有其他想法吗?

最佳答案

您可以使用附加行为将资源字典合并到每个窗口/页面/用户控件的资源,例如:

<Page my:Skinlibrary.Attach="True">
<!-- stuff goes here -->
</Page>

您可以将附加行​​为配置为始终将相同的资源字典实例合并到附加元素的资源。为此,您只需初始化资源字典一次,可能在静态构造函数中。

假设您已在名为“_staticResourceDictionaryThatHoldsMySkin”的变量中准备好资源,则在附加属性的“PropertyChanged”回调中,您可以执行以下操作将其合并到附加窗口:

static void OnAttachChanged(DependencyProperty sender, DependencyPropertyChangedEventArgs e)
{
(sender as FrameworkElement).Resources.MergedDictionaries.Add(_staticResourceDictionaryThatHoldsMySkinResources);
}

这将使您能够在编译时通过更改 SkinLibrary 文件来更改皮肤。您还可以通过首先检查配置文件来加载资源字典。

根据我的经验,皮肤将在 Visual Studio 设计器(2008 年和 2010 年)中正确显示。

关于在 Visual Studio 2008 Designer 中工作的 WPF 皮肤库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3623124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com