ResourceDictionary动态更新不会更新混合Winforms / WPF应用程序中的UI

时间:2019-06-25 00:13:18

标签: c# .net wpf

我有一个较旧的Winforms应用程序,现在我在其中将WPF用于所有新内容(托管在ElementHost中)

我希望在运行时更改样式(用于主题化)。

我的视图中包含以下资源字典。

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">    
      <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Themes/NightTheme.xaml"/>
      </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>

例如,在我的一个视图(UserControl)中,我将看到以下内容...

    <UserControl.Resources>
        <ResourceDictionary>
          <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="../AppStyles.xaml"/>
          </ResourceDictionary.MergedDictionaries>

我还具有以下代码,用于将出口(例如NightTheme.xaml)与另一个交换...

    public static void ChangeTheme(AppTheme theme)
    {
      try
      {
        if (theme == m_currentTheme)
        {     
          return;
        }

        ResourceDictionary appStyles = new ResourceDictionary();
        appStyles.Source = new Uri("/MyApp.UserInterface.WPF;component/AppStyles.xaml", UriKind.RelativeOrAbsolute);
        appStyles.MergedDictionaries.Clear();

        ResourceDictionary newTheme = new ResourceDictionary();
        newTheme.Source = new Uri(string.Format("/MyApp.UserInterface.WPF;component/Themes/{0}Theme.xaml", theme.ToString()), UriKind.RelativeOrAbsolute);
        appStyles.MergedDictionaries.Add(newTheme);        

        m_currentTheme = theme;
      }
      catch (Exception ex)
      {
        TraceError(ex.ToString());        
      }
    }

我可以看到所有词典都在加载,并且可以看到新的合并字典包含新值,但是,没有UI更新。

我什至尝试将其中一个元素更改为DynamicResource,即

<Grid Grid.ColumnSpan="2" Background="{DynamicResource CommandBarBackgroundColour}">

但这没什么不同。

我读过的其他地方说,像我上面提到的那样,在ResourceDictionary上删除然后添加新的MergedDictionaries应该更新UI(即使是从StaticResources),但在我看来,它不是。

有人知道为什么这不起作用吗?我该怎么做才能更新主题?

在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您必须将字典分配给SOMETHING,无论是全局应用程序资源还是当前视图的资源。现在,您的样式只是在内存中浮动,什么也不做。您至少必须这样做(如果样式是全局样式):

git clone --recursive https://github.com/gnuradio/gnuradio.git

或更妙的是:

Application.Current.Resources.MergedDictionaries.Add(myNewResourceDict);

此外,您还必须使用Application.Current.Resources.MergedDictionaries.Add(newTheme); Application.Current.Resources.MergedDictionariesClearRemove中删除以前的字典。

您现在所做的事情既太多又不够:

RemoveAt