modds C# 拖放式编程示例:股票图表自动补全(第 3 部分)





5.00/5 (4投票s)
可视化编程语言
引言
在modds C# 拖放式编程示例:股票图表(第 2 部分)中,我展示了如何创建一个股票图表程序。 Kelly 要求提供一个关于如何进行股票代码自动补全的示例。事实证明,自动补全需要多任务处理。最新版本的 modds 发布版支持多任务处理。
这里的问题是:股票代码通常是一个很大的列表。它需要一个数据库或 Web 服务器来存储该列表,并且查询可能需要一些时间。如果查询过程在 UI 线程中,那么当用户输入股票代码时,UI 的响应速度将会非常慢。我们需要将查询股票代码列表放到一个单独的线程中。在下一篇文章中,我将解释 modds 语言中多任务处理的工作原理。
项目需求
- modds C# 设计器(来自 www.modds.org)
- Microsoft Visual Studio(用于从附加的文件创建 DLL)
- Windows 7 或更高版本
- .NET Framework 4.5.2 或更高版本
向股票图表程序添加自动补全功能
向股票图表 XAML 视图添加自动补全功能
Microsoft WPFToolkit 包含一个 AutoComplexBox
控件。当用户输入股票代码时,我们需要将 TextChanged
事件传递给 modds 对象,并返回完成符号列表。
在 *MarketDataView.xaml* 标头中输入以下内容
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:cv="clr-namespace:modds.LIB.UI;assembly=modds.LIB.UI"
xmlns:Controls=clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input.Toolkit"
modds.LIB.UI
有一个类,它会将任何事件转换为命令,并且可以将所有事件参数传递给命令处理程序。
将股票代码 TextBox
更改为以下内容
<Controls:AutoCompleteBox Grid.Column="1"
Text="{Binding Symbol, Mode=TwoWay}"
SelectedItem="{Binding Symptom, Mode=TwoWay}"
ItemsSource="{Binding SymbolList}"
Width="156">
<i:Interaction.Triggers>
<i:EventTrigger EventName="TextChanged">
<cv:EventToCommand Command="{Binding SymbolChanged}"
PassEventArgsToCommand="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Controls:AutoCompleteBox>
添加自动补全参考 DLL
- 在解决方案面板中,右键单击“引用”并选择“添加项”,然后添加以下 DLL
- WPFTookit.dll
- system.windows.controls.input.toolkit.dll
- System.Windows.Interactivity.dll
- 在解决方案面板中,右键单击“引用”并选择“添加 C# 引用”,然后添加以下 DLL(我们不需要在程序包中使用以下 DLL。)
- System.dll
- System.Xaml.dll
- PresentationCore.dll
- PresentationFramework.dll
- WindowsBase.dll
创建“获取股票代码”通道
该通道用于 modds 模块间的通信。我将在以后的文章中进行更详细的说明。
- 在解决方案面板中,右键单击“股票图表”->“通道”,然后选择“添加命名空间”,并将其命名为“
GetStockSymbol
”。 - 右键单击
GetStockSymbol
并选择“添加广播”和“添加侦听器”。
创建获取代码服务器
- 在解决方案面板中,右键单击“股票图表”->“架构”,然后选择“新建架构”,并将其重命名为 *GetStockSymbolServer.xsml*。
- 双击 *GetStockSymbolServer.xsml* 将其打开。
- 在解决方案面板中,将“通道”->“GetStockSymbol”->“侦听器”拖到设计图面上,并将其设置为“不等待”(“不等待”将会使数据在不同的线程路径上流动)。
创建一个函数来查询股票代码
在这个例子中,为了简单起见,我们只是从一个文本文件中读取股票代码。
- 在控件工具箱面板中,拖入“脚本”=>“C# 脚本”,然后输入以下代码。
使用面板
using System;
using System.Collections.Generic;
代码面板
static public List<string> Projector(string startKey)
{
List<string> list = new List<string>();
string line;
System.IO.StreamReader file =
new System.IO.StreamReader(@"..\..\..\StockSymbols.txt");
while((line = file.ReadLine()) != null)
{
if (line.StartsWith(startKey.ToUpper()))
list.Add(line);
}
return list;
}
从“侦听器”控件中拖出“回复”,并将其连接如下
添加 TextChanged 事件处理程序
- 打开 *MainWindow.xsml*
- 在控件工具箱面板中,拖入“脚本”=>“C# 脚本”,然后输入以下代码。
使用面板
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Windows.Controls;
using System.Windows;
代码面板
static public string GetKeyInText(object parameters)
{
RoutedEventArgs args = parameters as RoutedEventArgs ;
AutoCompleteBox control = args.OriginalSource as AutoCompleteBox;
return control.Text;
}
添加 SymbolChanged 命令处理程序
- 在控件工具箱面板中,拖动“WPF 控件”->“命令”,并将其重命名为“
SymbolChanged
”。 - 在解决方案面板中,拖动
Channel
->GetSymbolServer
->Broadcast
并将其设置为 "No Wait"( The "No Wait" wil make data flow at different thread path) - 在“.NET DLL 工具箱”中,拖动“
CSharpCommonLibrary
”->“Class
”->“List<T>
”,并将其重命名为“SymbolList
”
- 将
CSharpCommonLibrary
->“原始类型”->String
拖到List <T>
如下连接控件
在 MainWindow.xsml 中创建一个 GetSymbolServer 对象实例
- 在解决方案面板中,打开 *MainWindow.xsml*
- 将 *GexsymbolSever.xsml* 拖到 *MainWindow.xsml*,请参见图像
现在,股票图表自动补全已完成。