股票图表程序的自动补全功能实现

问题在于,股票代码通常是一个庞大的列表,需要数据库或网络服务器来存储和查询,这可能需要一些时间。如果查询过程在用户界面(UI)线程中进行,那么当用户输入代码时,UI的响应将会非常慢。需要将查询股票代码列表的过程放在一个单独的线程中。在下一篇文章中,将解释modds语言中的多任务处理是如何工作的。

项目需求

  • moddsC#设计器(来自 )
  • Microsoft Visual Studio(用于从附加文件创建DLL)
  • Windows 7或更高版本
  • .NET Framework 4.5.2或更高版本

自动补全功能添加到股票图表程序中。

股票图表XAML视图中添加自动补全

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

在解决方案面板上,右键单击引用,然后选择“添加项目”,添加以下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->监听器拖到设计广播上,并设置为“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; }

将回复从监听器控件中拖出,并按如下方式连接:

添加TextChanged事件处理程序

打开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; }

添加SymbolChanged命令处理程序

在控件工具箱面板上,拖动WPF控件->命令并将其重命名为“SymbolChanged”。

在解决方案面板上,拖动通道->GetSymbolServer->广播,并设置为“No Wait”(“No Wait”将使数据流在不同的线程路径上)。

在.NET DLL工具箱中,拖动CSharpCommonLibrary->类->List并将其重命名为“SymbolList”。

将CSharpCommonLibrary->原始类型->String拖到List

按如下方式连接控件:

在MainWindow.xsml中创建GetSymbolServer对象实例

在解决方案面板上,打开MainWindow.xsml。

将GetSymbolSever.xsml拖到MainWindow.xsml中,参见图片。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485