我正在WinForms容器中托管一个WPF用户控件。现在,我希望能够为用户控件设置主题/外观。为此,我有几个资源字典定义了“皮肤”。当我的应用程序启动时,我创建了一个“new system.windows.application()”,这样应用程序.current就存在了。要更改主题,将删除旧外观,并在运行时将新外观合并到应用程序级资源字典中。但是,这不会改变用户控件中任意动态引用的资源。我在一个直接的WPF应用程序中尝试了这个方法,它运行得很好。我是错过了什么,还是根本做不到?顺便说一句,如果在初始化用户控件之前向应用程序资源中添加一个外观,它将起作用,但在此之后我不能更改外观。
以最基本的方式回购:
创建新的WinForms应用程序。向应用程序添加WPF用户控件。这很简单:
<UserControl ...>
<Grid>
<Button
Background="{DynamicResource ButtonBG}"/>
</Grid>
</UserControl>
创建两个ResourceDictionary,分别是white.xaml和black.xaml(或其他),其中solidColorBrush具有相应颜色的键buttonbg。在form1.cs中,添加两个按钮和一个elementhost。将elementHost的子级设置为刚刚创建的用户控件的实例。将按钮连接到交换皮肤的事件:
private void White_Click(object sender, EventArgs e)
{
Application.Current.Resources.MergedDictionaries[0] =
(ResourceDictionary)Application.LoadComponent(
new Uri(@"\WpfThemes;component\White.xaml", UriKind.Relative)));
}
private void Black_Click(object sender, EventArgs e)
{
Application.Current.Resources.MergedDictionaries[0] =
(ResourceDictionary)Application.LoadComponent(
new Uri(@"\WpfThemes;component\Black.xaml", UriKind.Relative)));
}
在program.cs中,确保application.current存在并设置初始外观:
[STAThread]
static void Main()
{
new System.Windows.Application();
Application.Current.Resources.MergedDictionaries[0] =
(ResourceDictionary)Application.LoadComponent(
new Uri(@"\WpfThemes;component\White.xaml", UriKind.Relative)));
...
}
现在,单击白色按钮时,我希望用户控件中的按钮变白,单击黑色按钮时,我希望按钮变黑。然而,这并没有发生。
有人知道为什么吗?有解决办法吗?
编辑:
想法:也许,如果有一种方法可以在主题改变时强制重新评估动态资源,那就行了。
谢谢,
尘土飞扬的