[C#] Zdarzenie zmiana schematu kolorów interfejsu


Rekomendowane odpowiedzi

Witam.

Czy mógłby ktoś podpowiedzieć jakie zdarzenie należy zasubskrybować, żeby śledzić zmianę schematu kolorów Dark/Light? Czy jest może jakaś zmienna systemowa albo jakaś propertka którą można sprawdzić aktualny schemat kolorów ZwCAD'a, no i czy można taką zmianę sprowokować programowo?

Odnośnik do komentarza
Udostępnij na innych stronach

No niestety. Chodzi mi o zmianę stylu interfejsu ciemny/jasny a nie zmianę koloru tła obszaru roboczego. Doprecyzuję cel. Chodzi o automatyzowanie dostosowania ładowanych pasków narzędzi do aktualnego stylu. Czy maja być ładowane ikony dostosowane do jasnego czy ciemnego tła.

Odnośnik do komentarza
Udostępnij na innych stronach

Faktycznie zmianą tego klucza można sterować jaki interfejs się załaduje przy starcie. Zmiana w trakcie działania nie przynosi efektu tzn. przy zamknięciu i tak do rejestru jest zapisywana ponownie wartość zgodna z chwilą zamknięcia. Tak więc tą metodą można sterować stylem gdy ZwCAD nie jest uruchomiony. Ale odczytać jak najbardziej można.

Dzięki za podpowiedź.

Natomiast otwartym pozostaje pytaniem o zdarzenie które jest uruchamiane w momencie zmiany w opcjach okna Options->Display->Color scheme.

Odnośnik do komentarza
Udostępnij na innych stronach

Wysłaliśmy zapytanie do ZWSOFT czy taka zmienna jest zaimplementowana w programie.

W tak zwanym międzyczasie utworzyliśmy skrypt w C#, który wykrywa i wyświetla w linii poleceń zmiany zmiennych w programie.

Niestety zmiana koloru interfejsu nie wpływa na żadną zmienną systemową.

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • 1 miesiąc temu...

Znalazłem sposób na monitorowanie zmiany interfejsu więc się dzielę moim rozwiązaniem dla potomności co pozwoli zamknąć ten wątek:

1. Trzeba zasubskrybować się do handlera ApplicationServices.SystemVariableChangedEventHandler

2. W obsłudze zdarzenia trzeba sprawdzić, zmiana której zmiennej systemowej wywołała to zdarzenie. Jeżeli zdarzenie wywołała zmienna COLORSCHEME należy odczytać z rejestru systemowego wartość COLORSCHEME klucza Software\ZWSOFT\ZWCAD\2020\en-US\Profiles\Default\Config (dla wersji EN, dla PL trzeba odczytać z gałęzi pl-PL) Dzięki Adam Klaczek. Twoja podpowiedź była bardzo pomocna.

podpięcie do handlera i metoda podpinana do handlera

Application.SystemVariableChanged += OnSystemVariableChanged
        private void OnSystemVariableChanged(object _sender, SystemVariableChangedEventArgs _arg)
        {
            if (_arg.Name == "COLORSCHEME")
            {
// tu pobieram z kontenera dependece injection instancję serwisu obsługującego schemat kolorów interfejsu ZwCAD'a
// i odpalam własne zdarzenie rozgłaszające, że została dokonana zmiana kolorów
                using(var scope = DI.Container.BeginLifetimeScope())
                {
                    var service = DI.Container.Resolve<IInterfaceSchemeService>();
                    ChangeInterfaceScheme?.Invoke(_sender, new ChangeInterfaceSchemeEventArgs(service));
                }
            }
        }

w której odpalam już własne zdarzenie ChangeInterfaceScheme (skoro nie dokopałem się do takiego zdarzenia dostarczanego przez ZwSOFT to sobie zrobiłem własne 😁 )

public event EventHandler<ChangeInterfaceSchemeEventArgs> ChangeInterfaceScheme;
    public class ChangeInterfaceSchemeEventArgs : EventArgs
    {
        public IInterfaceSchemeService Service { private set; get; }

        public ChangeInterfaceSchemeEventArgs(IInterfaceSchemeService _service)
        {
            Service = _service;
        }
    }

W mojej konkretnej implementacji do zdarzenia mogą być podpinane metody przyjmujące w argumencie serwis IInterfaceSchemeService który zajmuje się dostarczaniem kolorów do kontrolek interfejsu użytkownika. Jest to instancja mojej własnej klasy którą pozyskuję z kontenera zależności Autofac. Handler ChangeInterfaceScheme jest właściwością mojej klasy statycznej AppSettings która jest dostępna w całej aplikacji i trzyma róże globalne ustawienia. Klasyczny singleton. Dlatego do tego handlera mogę podpiąć w dowolnym miejscu aplikacji dowolną obsługę zdarzenia zmiany interfejsu uzyskując dostęp do serwisu podającego na tacy jakie kolory mają mieć aktualnie kontrolki. Wystarczy zmienić właściwości kontrolek WindowsForms, HTML, WPF czy czego tam się nie używa. Jeszcze tylko specyfikacja IInterfaceSchemeService

    public interface IInterfaceSchemeService
    {
        InterfaceScheme GetScheme();
        Color GetBackColor();
        Color GetForeColor();
    }

Na koniec należy dodać, że mój serwis InterfaceSchemeService posiada statyczną właściwość ColorScheme którą mogę odczytać w dowolnym miejscu aplikacji w szczególności przy starcie aplikacji i dzięki temu moja nakładka od razu może startować ze zgodnymi kolorami. 

Pełna implementacja z zastosowaniem jest dostępna w moim szarpowaniu opisanym w tym wątku gdzie znajduje się link do GITHub'a z kompletnymi źródłami.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 7 miesięcy temu...

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie