perlon Posted December 17, 2019 Report Posted December 17, 2019 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? Quote
Marek-M Posted December 17, 2019 Report Posted December 17, 2019 (edited) Cześć, Może rozwiązanie z tego wątku będzie Ci pomocne - ja stosuję i polecam https://forum.cad.info.pl/topic/1814-zmiana-koloru-tła-działało-w-zw2015-nie-działa-w-zw2017/?tab=comments#comment-12721 Edited December 17, 2019 by Marek-M Quote
perlon Posted December 17, 2019 Author Report Posted December 17, 2019 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. Quote
Adam Klaczek Posted December 17, 2019 Report Posted December 17, 2019 Nie wiem, czy to pomoże - ale w rejestrze trzymane to jest tutaj: perlon 1 Quote
perlon Posted December 17, 2019 Author Report Posted December 17, 2019 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. Quote
dmatusz3 Posted December 18, 2019 Report Posted December 18, 2019 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ą. Quote
perlon Posted February 14, 2020 Author Report Posted February 14, 2020 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. dmatusz3 1 Quote
dmatusz3 Posted September 28, 2020 Report Posted September 28, 2020 W ZWCAD 2021 proszę sprawdzić zmienną systemową COLORTHEME perlon 1 Quote
perlon Posted September 28, 2020 Author Report Posted September 28, 2020 Pomocne bo nie trzeba gmerać w rejestrze tylko od razu sprawdzić wartość zmiennej systemowej Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.