问题在于,股票代码通常是一个庞大的列表,需要数据库或网络服务器来存储和查询,这可能需要一些时间。如果查询过程在用户界面(UI)线程中进行,那么当用户输入代码时,UI的响应将会非常慢。需要将查询股票代码列表的过程放在一个单独的线程中。在下一篇文章中,将解释modds语言中的多任务处理是如何工作的。
将自动补全功能添加到股票图表程序中。
Microsoft WPF Toolkit有一个AutoCompleteBox控件。当用户输入代码时,需要将TextChanged事件传递给modds对象,并返回补全代码列表。
在MarketDataView.xaml的头部添加以下内容:
<XML 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:
在解决方案面板上,右键单击引用,然后选择“添加C#引用”,添加以下DLL(不需要在程序包中包含以下DLL):
通道用于modds模块之间的通信。将在以后的文章中详细解释。
在解决方案面板上,右键单击股票图表->通道,然后选择添加命名空间并命名为“GetStockSymbol”。
右键单击GetStockSymbol,然后选择“添加广播”和“添加监听器”。
在解决方案面板上,右键单击股票图表->架构,然后选择新建架构并将其重命名为GetStockSymbolServer.xsml。
双击GetStockSymbolServer.xsml打开。
在解决方案面板上,将通道->GetStockSymbol->监听器拖到设计广播上,并设置为“No Wait”(“No Wait”将使数据流在不同的线程路径上)。
在这个例子中,只是简单地从文本文件中读取股票代码。
using System;
using System.Collections.Generic;
static public List Projector(string startKey) {
List list = new List();
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;
}
将回复从监听器控件中拖出,并按如下方式连接:
打开MainWindow.xsml。
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;
}
在控件工具箱面板上,拖动WPF控件->命令并将其重命名为“SymbolChanged”。
在解决方案面板上,拖动通道->GetSymbolServer->广播,并设置为“No Wait”(“No Wait”将使数据流在不同的线程路径上)。
在.NET DLL工具箱中,拖动CSharpCommonLibrary->类->List
将CSharpCommonLibrary->原始类型->String拖到List
按如下方式连接控件:
在解决方案面板上,打开MainWindow.xsml。
将GetSymbolSever.xsml拖到MainWindow.xsml中,参见图片。