65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2016 年 8 月 1 日

CPOL

3分钟阅读

viewsIcon

11769

downloadIcon

488

可视化编程语言

Youtube 视频

引言

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

  1. 在解决方案面板中,右键单击“引用”并选择“添加项”,然后添加以下 DLL
    • WPFTookit.dll
    • system.windows.controls.input.toolkit.dll
    • System.Windows.Interactivity.dll
  2. 在解决方案面板中,右键单击“引用”并选择“添加 C# 引用”,然后添加以下 DLL(我们不需要在程序包中使用以下 DLL。)
    • System.dll
    • System.Xaml.dll
    • PresentationCore.dll
    • PresentationFramework.dll
    • WindowsBase.dll

创建“获取股票代码”通道

该通道用于 modds 模块间的通信。我将在以后的文章中进行更详细的说明。

  1. 在解决方案面板中,右键单击“股票图表”->“通道”,然后选择“添加命名空间”,并将其命名为“GetStockSymbol”。
  2. 右键单击 GetStockSymbol 并选择“添加广播”和“添加侦听器”。

创建获取代码服务器

  1. 在解决方案面板中,右键单击“股票图表”->“架构”,然后选择“新建架构”,并将其重命名为 *GetStockSymbolServer.xsml*。
  2. 双击 *GetStockSymbolServer.xsml* 将其打开。
  3. 在解决方案面板中,将“通道”->“GetStockSymbol”->“侦听器”拖到设计图面上,并将其设置为“不等待”(“不等待”将会使数据在不同的线程路径上流动)。

创建一个函数来查询股票代码

在这个例子中,为了简单起见,我们只是从一个文本文件中读取股票代码。

  1. 在控件工具箱面板中,拖入“脚本”=>“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 事件处理程序

  1. 打开 *MainWindow.xsml*
  2. 在控件工具箱面板中,拖入“脚本”=>“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 命令处理程序

  1. 在控件工具箱面板中,拖动“WPF 控件”->“命令”,并将其重命名为“SymbolChanged”。
  2. 在解决方案面板中,拖动 Channel->GetSymbolServer->Broadcast 并将其设置为 "No Wait"( The "No Wait" wil make data flow at different thread path)
  3. 在“.NET DLL 工具箱”中,拖动“CSharpCommonLibrary”->“Class”->“List<T>”,并将其重命名为“SymbolList
  • CSharpCommonLibrary->“原始类型”->String 拖到 List <T>

如下连接控件

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

  1. 在解决方案面板中,打开 *MainWindow.xsml*
  2. 将 *GexsymbolSever.xsml* 拖到 *MainWindow.xsml*,请参见图像

现在,股票图表自动补全已完成。

modds C# 拖放式编程调试(第 4 部分)

© . All rights reserved.