Использование словаря приложений с InkEdit
Чтобы создать словарь приложения, необходимо задать свойство WordList объекта RecognizerContext . Элемент управления InkEdit не предоставляет объект RecognizerContext , поэтому невозможно напрямую задать свойство WordList объекта RecognizerContext элемента управления InkEdit.
Чтобы использовать словарь приложения с элементом управления 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;
}
Связанные темы