Windows Presentation Foundation (WPF) là một giải pháp giao diện người dùng (UI) Windows là một phần của .NET. Ban đầu được phát triển vào năm 2006, nó được dự định là người kế nhiệm của WinForms. Để biết thêm thông tin, hãy tham khảo tài liệu chính thức của nó.
WPF cho phép tạo ra UI phong phú và tinh vi. Nó tách biệt mã khỏi UI bằng cách sử dụng XAML, một ngôn ngữ dựa trên XML được phát triển bởi Microsoft. cTrader Windows là một ứng dụng WPF và tất cả các phần tử UI bạn đang thấy đều được hỗ trợ bởi giải pháp này.
Việc sử dụng WPF cho phép phát triển UI giàu tính năng gần như hoàn hảo đến từng pixel. Tuy nhiên, WPF có đường cong học tập dốc. Nếu bạn muốn tạo các phần tử UI tương đối đơn giản, bạn có thể muốn sử dụng điều khiển biểu đồ hoặc WinForms.
Ghi chú
Các thuật toán sử dụng WinForms hoặc WPF chỉ có thể chạy trên máy Windows.
Tương tự như WinForms, trước khi bạn có thể sử dụng WPF với cBot và chỉ báo của mình, bạn sẽ phải thực hiện một số thay đổi đối với tệp dự án chỉ báo hoặc cBot của bạn. Vì WPF chỉ hoạt động trên Windows, bạn sẽ phải thay đổi khung mục tiêu của dự án chỉ báo hoặc cBot của bạn thành biến thể Windows của .NET.
Để làm điều này, mở tệp dự án của bạn trong Visual Studio và thay thế nội dung của nó bằng những điều sau:
Chúng tôi đã thêm thẻ UseWpf và thay đổi giá trị của TargetFramework thành net6.0-windows.
Sau đó, thay đổi giá trị của tham số lớp AccessRights thành FullAccess. Trừ khi thay đổi này được thực hiện, tiện ích mở rộng của bạn sẽ không có đủ quyền truy cập để hoạt động với WPF.
Xây dựng lại dự án của bạn sau khi thực hiện các thay đổi trên.
Sau khi bạn đã cấu hình dự án của mình, nhấp chuột phải vào nó, chọn Add và sau đó chọn Window (WPF)....
Trong cửa sổ mới mở, chọn tùy chọn WPF window. Đặt tên cửa sổ là MainWindow và nhấp vào nút Add. Cửa sổ WPF mới sẽ xuất hiện trong trình khám phá giải pháp dự án của bạn. Nó sẽ có hai tệp, một tệp .XAML và một tệp .cs chứa mã backend.
Mở tệp .XAML và sao chép và dán mã sau vào đó để thay đổi màu nền thành "SlateGray".
Khi bạn thêm một cửa sổ WPF mới, nó sẽ sử dụng không gian tên của chỉ báo hoặc cBot của bạn (như cAlgo). Trong tệp .cs chứa mã backend của cửa sổ, thay đổi nó thành WPF_Test và đảm bảo nó khớp với câu lệnh using trong mã chỉ báo của bạn.
Xây dựng lại chỉ báo từ Visual Studio hoặc sử dụng cTrader Algo.
Sau khi quá trình xây dựng hoàn tất, tạo một phiên bản chỉ báo. Bạn sẽ thấy cửa sổ tùy chỉnh của mình xuất hiện gần như ngay lập tức khi khởi chạy.
Hiển thị bảng giao dịch
Trong ví dụ này, chúng ta sẽ tạo một bảng giao dịch đơn giản bằng WPF. Tạo một cBot mới và đặt tên là WPF Trading Panel.
Mở robot mới của bạn trong Visual Studio và thêm một tài nguyên WPF mới như đã nêu ở trên. Đặt tên cửa sổ là MainWindow.
Sau đó, mở tệp .XAML của cửa sổ và dán mã sau vào đó:
Xây dựng lại mã của bạn bằng Visual Studio và tạo một phiên bản cBot của bạn. Chạy nó và cửa sổ sau sẽ xuất hiện.
Trong cửa sổ, chọn một ký hiệu từ danh sách ký hiệu và nhấp vào Execute. Mặc dù bảng giao dịch của chúng ta hơi đơn giản, nhưng nó hoạt động như dự định. Bạn có thể sử dụng nó làm mẫu để tạo các điều khiển WPF phức tạp.
Mã trong tệp .xaml.cs cho cửa sổ của chúng ta chịu trách nhiệm gửi hướng dẫn đến cBot của chúng ta. Khi phát triển mã backend cho cửa sổ của bạn, hãy tuân theo các hướng dẫn sau:
Tạo một dịch vụ để quản lý tương tác với cBot hoặc chỉ báo bằng phương thức BeginInvokeOnMainThread().
Nếu bạn đang xây dựng các điều khiển WPF phức tạp, hãy sử dụng MVVM, IoC và tách các thành phần logic kinh doanh của bạn khỏi UI (ví dụ: bằng cách sử dụng Prism)
Sử dụng một luồng chuyên dụng cho giao diện người dùng
Bạn không thể thay đổi thuộc tính ApartmentState của một luồng đang chạy. Vì luồng chính của cBot hoặc chỉ báo không được đánh dấu STA, bạn phải sử dụng một luồng mới được đánh dấu STA cho WinForms và WPF.
Truy cập các thành viên API từ luồng UI
Như chúng tôi đã giải thích trước đó, bạn phải sử dụng một luồng chuyên dụng riêng biệt để chạy các điều khiển WPF của mình. Chỉ có mã thực thi trên luồng này mới có thể truy cập các điều khiển và thuộc tính của cửa sổ.
Điều tương tự cũng đúng với tất cả các thành viên API thuật toán. Vì API không an toàn cho luồng, bạn không thể truy cập các thành viên API từ luồng UI. Thay vào đó, bạn phải gửi công việc bằng cách sử dụng phương thức BeginInvokeOnMainThread() trong mã chỉ báo hoặc cBot của bạn.
Điều này có thể tạo ra các phức tạp nếu bạn muốn trao đổi dữ liệu giữa chỉ báo hoặc cBot của bạn và một cửa sổ WPF. Để giải quyết vấn đề này, bạn có thể tạo một lớp proxy để quản lý tương tác giữa cBot hoặc chỉ báo của bạn và các luồng liên quan đến UI.