Windows Presentation Foundation (WPF) to rozwiązanie interfejsu użytkownika (UI) Windows, które jest częścią .NET. Pierwotnie opracowane w 2006 roku, było zamierzone jako następca WinForms. Aby uzyskać dodatkowe informacje, zapoznaj się z jego oficjalną dokumentacją.
WPF pozwala na tworzenie bogatego i wyrafinowanego UI. Oddziela kod od UI, używając XAML, języka opartego na XML opracowanego przez Microsoft. cTrader Windows to aplikacja WPF, a wszystkie elementy UI, które widzisz, są zasilane przez to rozwiązanie.
Użycie WPF pozwala na tworzenie niemal piksel-perfekcyjnego, bogatego w funkcje UI. Jednak WPF ma stromą krzywą uczenia się. Jeśli chcesz tworzyć stosunkowo proste elementy UI, możesz chcieć użyć kontrolek wykresu lub WinForms.
Uwaga
Algorytmy używające WinForms lub WPF mogą być uruchamiane tylko na komputerach z systemem Windows.
Aby używać WPF z cBotami i wskaźnikami, zmień swój kompilator cTrader z wbudowanego kompilatora na kompilator .NET SDK.
Konfiguracja projektu
Podobnie jak w przypadku WinForms, zanim będziesz mógł używać WPF ze swoimi cBotami i wskaźnikami, będziesz musiał wprowadzić pewne zmiany w pliku projektu swojego wskaźnika lub cBota. Ponieważ WPF działa tylko na Windows, będziesz musiał zmienić docelowy framework swojego projektu wskaźnika lub cBota na wariant Windows .NET.
Aby to zrobić, otwórz plik projektu w Visual Studio i zastąp jego zawartość następującą:
Dodaliśmy tag UseWpf i zmieniliśmy wartość TargetFramework na net6.0-windows.
Następnie zmień wartość parametru klasy AccessRights na FullAccess. Jeśli ta zmiana nie zostanie wprowadzona, Twoje rozszerzenie nie będzie miało wystarczających praw dostępu do pracy z WPF.
Przebuduj swój projekt po wprowadzeniu powyższych zmian.
Po skonfigurowaniu projektu kliknij go prawym przyciskiem myszy, wybierz Dodaj, a następnie wybierz Okno (WPF)....
W nowo otwartym oknie wybierz opcję Okno WPF. Ustaw nazwę okna na MainWindow i kliknij przycisk Dodaj. Nowe okno WPF pojawi się w eksploratorze rozwiązań Twojego projektu. Będzie miało dwa pliki: plik .XAML i plik .cs zawierający kod backendu.
Otwórz plik .XAML i skopiuj i wklej do niego następujący kod, aby zmienić jego kolor tła na "SlateGray".
Gdy dodasz nowe okno WPF, użyje ono przestrzeni nazw Twojego wskaźnika lub cBota (takiej jak cAlgo). W pliku .cs zawierającym kod backendu okna zmień ją na WPF_Test i upewnij się, że pasuje do Twojej instrukcji using w kodzie wskaźnika.
Przebuduj wskaźnik z Visual Studio lub używając cTrader Algo.
Po zakończeniu procesu budowania utwórz instancję wskaźnika. Twoje niestandardowe okno powinno pojawić się niemal natychmiast po uruchomieniu.
Wyświetl panel handlowy
W tym przykładzie utworzymy prosty panel handlowy za pomocą WPF. Utwórz nowego cBota i ustaw jego nazwę na WPF Trading Panel.
Otwórz swojego nowego robota w Visual Studio i dodaj nowy zasób WPF, jak opisano powyżej. Ustaw nazwę okna na MainWindow.
Następnie otwórz plik .XAML okna i wklej do niego następujący kod:
Przebuduj swój kod za pomocą Visual Studio i utwórz instancję swojego cBota. Uruchom go, a następujące okno powinno się pojawić.
W oknie wybierz symbol z listy symboli i kliknij Wykonaj. Chociaż nasz panel handlowy jest nieco prosty, działa zgodnie z przeznaczeniem. Możesz go użyć jako szablonu do tworzenia złożonych kontrolek WPF.
Kod w pliku .xaml.cs dla naszego okna jest odpowiedzialny za wysyłanie instrukcji do naszego cBota. Podczas tworzenia kodu backendu dla swoich okien przestrzegaj następujących wytycznych:
Utwórz usługę do zarządzania interakcjami z cBotem lub wskaźnikiem przy użyciu metody BeginInvokeOnMainThread().
Jeśli tworzysz złożone kontrolki WPF, użyj MVVM, IoC i oddziel komponenty logiki biznesowej od interfejsu użytkownika (na przykład przy użyciu Prism)
Używanie dedykowanego wątku dla interfejsu użytkownika
Nie możesz zmienić właściwości ApartmentState już działającego wątku. Ponieważ główny wątek cBota lub wskaźnika nie jest oznaczony jako STA, musisz użyć nowego wątku oznaczonego jako STA dla WinForms i WPF.
Uzyskuj dostęp do elementów API z wątku interfejsu użytkownika
Jak wyjaśniliśmy wcześniej, musisz użyć oddzielnego dedykowanego wątku do uruchamiania kontrolek WPF. Tylko kod wykonywany w tym wątku będzie mógł uzyskać dostęp do kontrolek i właściwości okna.
To samo dotyczy wszystkich elementów API algorytmów. Ponieważ API nie jest bezpieczne wątkowo, nie możesz uzyskać dostępu do elementów API z wątku interfejsu użytkownika. Zamiast tego musisz wysłać pracę przy użyciu metody BeginInvokeOnMainThread() w kodzie wskaźnika lub cBota.
Może to stworzyć komplikacje, jeśli chcesz wymieniać dane między wskaźnikiem lub cBotem a oknem WPF. Aby rozwiązać ten problem, możesz utworzyć klasę proxy do zarządzania interakcjami między cBotem lub wskaźnikiem a wątkami związanymi z interfejsem użytkownika.