Пользовательский интерфейс (GUI)
Данный топик предназначен для трейдеров, которые разрабатывают графические торговые программы с помощью S#, но недостаточно знакомы с азами программирования графического интерфейса под .NET.
В .NET существует специальная технология для построения графического интерфейса – WPF (до этого была технология WinForms, которая значительно уступает по графическим возможностям). В этой технологии для создания графических элементов используется специальный декларативный язык XAML.
Основное ограничение визуального API под Windows состоит в том, что нельзя обращаться из другого потока к элементам окна. Это связанно с ограничениями архитектуры Windows (подробнее описано здесь https://msdn.microsoft.com/ru-ru/library/ms741870.aspx). Реализации шлюза IConnector в целях повышения производительности работают в многопоточном режиме. Поэтому, подписываясь на событие, например, Connector.NewSecurity, нельзя напрямую выводить полученные данные в окно пользователя. Для этого нужно провести операцию синхронизации при помощи специального объекта Dispatcher, который управляет очередью рабочих элементов потока.
Вот простой пример, как это делается:
// обязательно нужно вызвать метод BeginInvoke,
// и уже в его обработчике можно обратиться к элементу окна 'Security' (это выпадающий список)
_connector.NewSecurity += security => this.Dispatcher.BeginInvoke((Action)(() => this.Security.ItemsSource = _connector.Securities));
S# уже содержит специальные методы, которые скрывают использование Dispatcher и упрощают написание кода:
// обязательно нужно вызвать метод GuiSync, прежде чем обратиться к элементу окна 'Security' (это выпадающий список)
_connector.NewSecurity += security => this.GuiSync(() => this.Security.ItemsSource = _connector.Securities);
Графические компоненты S#
В состав S# входит большое количество собственных графических компонент, которые размещены в пространствах имен StockSharp.Xaml, StockSharp.Xaml.Charting и StockSharp.Xaml.Diagram.
S# имеет различные контролы для:
- поиска и выбора данных (инструментов, портфелей, адресов);
- создания заявок;
- отображения биржевой и другой информации (сделки, заявки, транзакции, стаканы, логи и т.д.);
- построения графиков.
Для доступа к графическим контролам S# в коде XAML необходимо определить псевдонимы для соответствующих пространств имен и использовать эти псевдонимы в коде XAML. Как это сделать показано в следующем примере:
<Window x:Class="SampleSmartSMA.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:loc="clr-namespace:StockSharp.Localization;assembly=StockSharp.Localization"
xmlns:sx="clr-namespace:StockSharp.Xaml;assembly=StockSharp.Xaml"
xmlns:ss="clr-namespace:StockSharp.SmartCom.Xaml;assembly=StockSharp.SmartCom"
xmlns:charting="http://schemas.stocksharp.com/xaml"
Title="{x:Static loc:LocalizedStrings.XamlStr570}" Height="700" Width="900">
<Grid>
</Grid>
</Window>