Подтвердить что ты не робот

Изменение темы во время выполнения

У меня есть приложение WPF с темой (ShinyRed.xaml), и у меня есть кнопка, которая при нажатии меняет тему на ShinyBlue.xaml

Я загружаю тему сначала в App.xaml:

<Application.Resources>
    <ResourceDictionary Source="/Themes/ShinyBlue.xaml"/>
</Application.Resources>

Как я могу это сделать?

4b9b3361

Ответ 1

Вот статья, которая проведет вас через нее:

http://svetoslavsavov.blogspot.com/2009/07/switching-wpf-interface-themes-at.html

В основном вам нужно удалить "старую" тему из словаря ресурсов, а затем объединить новую. В приведенной выше статье показано, как сделать это изменение очень простым.

Ответ 2

Как вы могли это сделать:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary x:Name="ThemeDictionary">
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="/Themes/ShinyRed.xaml"/>
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    <!-- ... -->
public partial class App : Application
{
    public ResourceDictionary ThemeDictionary
    {
        // You could probably get it via its name with some query logic as well.
        get { return Resources.MergedDictionaries[0]; }
    }

    public void ChangeTheme(Uri uri)
    {
        ThemeDictionary.MergedDictionaries.Clear();
        ThemeDictionary.MergedDictionaries.Add(new ResourceDictionary() { Source = uri });
    }

    //...
}

В вашем методе изменения:

var app = (App)Application.Current;
app.ChangeTheme(new Uri("New Uri here"));

Ответ 3

Im, используя следующую команду для установки темы во время выполнения:

Application.Current.Resources.Source = new Uri("/Themes/ShinyRed.xaml", UriKind.RelativeOrAbsolute);

Ответ 4

H.B. ответ не сработал у меня, я должен был это сделать (работает, тестировался):

Uri dictUri = new Uri(@"/Resources/Themes/MyTheme.xaml", UriKind.Relative);
ResourceDictionary resourceDict = Application.LoadComponent(dictUri) as ResourceDictionary;
Application.Current.Resources.MergedDictionaries.Clear();
Application.Current.Resources.MergedDictionaries.Add(resourceDict);

Довольно это:

// Place in App.xaml.cs
public void ChangeTheme(Uri uri)
{
    ResourceDictionary resourceDict = Application.LoadComponent(uri) as ResourceDictionary;
    Application.Current.Resources.MergedDictionaries.Clear();
    Application.Current.Resources.MergedDictionaries.Add(resourceDict);
}

// Example Usage (anywhere in app)
private void ThemeRed_Click(object sender, RoutedEventArgs e)
{
    var app = App.Current as App;
    app.ChangeTheme(new Uri(@"/Resources/Themes/RedTheme.xaml", UriKind.Relative));      
}

Ответ 5

App.xaml

    <Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Themes/Font.xaml" />
            <ResourceDictionary Source="Themes/Light.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

В вашем коде:

> Application.Current.Resources.MergedDictionaries[1].Source = new Uri("Themes/Dark.xaml", UriKind.RelativeOrAbsolute);

вы можете проверить это, чтобы убедиться, что ничего не растет

Application.Current.Resources.MergedDictionaries.Count.ToString();