perlon

[C#] Zdarzenie zmiana schematu kolorów interfejsu

Recommended Posts

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?

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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ą.

 

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...