mirror of
https://gitee.com/akwkevin/aistudio.-wpf.-diagram
synced 2026-03-04 08:40:51 +08:00
114 lines
3.4 KiB
C#
114 lines
3.4 KiB
C#
namespace FluentTest.ViewModels.IssueRepros
|
|
{
|
|
using System;
|
|
using System.Diagnostics;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using System.Windows;
|
|
using ControlzEx.Theming;
|
|
using Fluent.Extensions;
|
|
using FluentTest.Commanding;
|
|
|
|
public class ThemeManagerFromThread
|
|
{
|
|
private int currentTheme;
|
|
private CancellationTokenSource cancellationTokenSource;
|
|
|
|
public enum ThemeColors
|
|
{
|
|
Red,
|
|
Amber,
|
|
Emerald,
|
|
}
|
|
|
|
public ThemeManagerFromThread()
|
|
{
|
|
this.StartStopCommand = new RelayCommand(this.StartStop);
|
|
}
|
|
|
|
public RelayCommand StartStopCommand { get; set; }
|
|
|
|
private void Info(string info)
|
|
{
|
|
Trace.WriteLine($@"{DateTime.Now} {info}");
|
|
}
|
|
|
|
private void StartStop()
|
|
{
|
|
if (this.cancellationTokenSource != null)
|
|
{
|
|
ThemeManager.Current.ThemeChanged -= this.ThemeManagerThemeChangedHandler;
|
|
|
|
this.cancellationTokenSource.Cancel();
|
|
}
|
|
else
|
|
{
|
|
ThemeManager.Current.ThemeChanged += this.ThemeManagerThemeChangedHandler;
|
|
|
|
Task.Factory.StartNew(async () =>
|
|
{
|
|
while (this.cancellationTokenSource.IsCancellationRequested == false)
|
|
{
|
|
this.ThreadProc();
|
|
|
|
await Task.Delay(TimeSpan.FromSeconds(2));
|
|
}
|
|
|
|
this.cancellationTokenSource.Dispose();
|
|
this.cancellationTokenSource = null;
|
|
}, (this.cancellationTokenSource = new CancellationTokenSource()).Token);
|
|
}
|
|
}
|
|
|
|
private void ThreadProc()
|
|
{
|
|
if (this.currentTheme > 2)
|
|
{
|
|
this.currentTheme = 0;
|
|
}
|
|
|
|
var newTheme = (ThemeColors)this.currentTheme;
|
|
|
|
this.Info("Changing theme to " + newTheme);
|
|
this.ChangeTheme(newTheme);
|
|
|
|
this.currentTheme++;
|
|
}
|
|
|
|
private void ChangeTheme(ThemeColors themeColor)
|
|
{
|
|
if (!Application.Current.Dispatcher.CheckAccess())
|
|
{
|
|
Application.Current.RunInDispatcherAsync(() => this.ChangeTheme(themeColor));
|
|
}
|
|
else
|
|
{
|
|
var newTheme = ThemeManager.Current.GetTheme("Light." + themeColor.ToString());
|
|
if (newTheme != null)
|
|
{
|
|
ThemeManager.Current.ChangeTheme(Application.Current, newTheme);
|
|
|
|
this.Info($"Change theme: NewTheme: {newTheme.Name} Theme changed.");
|
|
}
|
|
else
|
|
{
|
|
this.Info($"Change theme: Theme not found: {themeColor}.");
|
|
}
|
|
}
|
|
}
|
|
|
|
private void ThemeManagerThemeChangedHandler(object sender, ThemeChangedEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
var theme = ThemeManager.Current.DetectTheme(Application.Current);
|
|
this.Info($"Current theme from args: {e.NewTheme.Name}");
|
|
this.Info($"Current theme from detection: {theme.Name}");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
this.Info(ex.Message);
|
|
}
|
|
}
|
|
}
|
|
} |