将应用程序字典与 InkEdit 配合使用
若要创建应用程序字典,必须设置 RecognizerContext 对象的 WordList 属性。 InkEdit 控件不公开 RecognizerContext 对象,因此无法直接设置 InkEdit 控件的 RecognizerContext 对象的 WordList 属性。
若要将应用程序字典与 InkEdit 控件一起使用,必须从 InkEdit 控件中取出笔划,将它们传递给新的 RecognizerContext 对象,并将 WordList 属性设置为包含应用程序字典的 WordList ,存储来自此 RecognizerContext 对象的结果,然后将结果传递回 InkEdit 控件。
示例
以下 C# 代码演示了此方法的示例。
private RecognizerContext rc;
private WordList wl;
private int wlSelStart;
private int wlSelLen;
private bool isRecoPending = false;
private void Form1_Load(object sender, EventArgs e)
{
//event handlers must be attached for dictionary to work.
inkEdit1.Recognition += new Microsoft.Ink.InkEditRecognitionEventHandler(inkEdit1_Recognition);
inkEdit1.TextChanged += new EventHandler(inkEdit1_TextChanged);
//create a WordList that contains the application dictionary
wl = new WordList();
//...
//Add dictionary terms to the WordList
//...
// create a RecognizerContext for the WordList
rc = inkEdit1.Recognizer.CreateRecognizerContext();
rc.Factoid = Factoid.WordList;
//set the RecognizerContext WordList to the newly created WordList
rc.WordList = wl;
//create a delegate for the new RecognizerContext
rc.RecognitionWithAlternates += new
RecognizerContextRecognitionWithAlternatesEventHandler(rc_Recognition);
}
void inkEdit1_TextChanged(object sender, EventArgs e)
{
if (isRecoPending)
{
isRecoPending = false;
rc.BackgroundRecognizeWithAlternates();
}
}
private void inkEdit1_Recognition(object sender,
Microsoft.Ink.InkEditRecognitionEventArgs e)
{
//store the start of the selection in wlSelStart
wlSelStart = inkEdit1.SelectionStart;
//store the length of the selection in wlSelLen
wlSelLen = e.RecognitionResult.TopString.Length;
//copy the strokes from the InkEdit control into the new
// RecognizerContext
rc.Strokes = e.RecognitionResult.Strokes.Ink.Clone().Strokes;
isRecoPending = true;
}
private void rc_Recognition(object sender,
Microsoft.Ink.RecognizerContextRecognitionWithAlternatesEventArgs e)
{
if (inkEdit1.InvokeRequired)
{
inkEdit1.Invoke(new RecognizerContextRecognitionWithAlternatesEventHandler(rc_Recognition),
new object[] { sender, e });
return;
}
//set the insertion point in the InkEdit control
inkEdit1.SelectionStart = wlSelStart;
inkEdit1.SelectionLength = wlSelLen;
//insert the result from the new RecognizerContext
//into the InkEdit control
inkEdit1.SelectedText = e.Result.TopString;
inkEdit1.SelectionStart = inkEdit1.SelectionStart +
e.Result.TopString.Length;
}
// Event handler for the form's closed event
private void Form1_Closed(object sender, System.EventArgs e)
{
inkEdit1.Dispose();
inkEdit1 = null;
rc.Dispose();
rc = null;
}
相关主题