Мы работаем над приложением WPF в .NET 4, которое будет использоваться с сенсорным экраном. Мы пытаемся использовать встроенную Windows OSK для нашего ввода, и последняя оставшаяся проблема заключается в том, чтобы заставить клавиатуру открываться, как только текстовое поле получает фокус. В настоящее время, если текстовое поле получает фокус, появляется небольшой значок клавиатуры (это значок InputPanel), и пользователь должен коснуться этого значка, чтобы открыть клавиатуру.
Есть ли способ пропустить шаг со значком и просто полностью открыть клавиатуру в фокусе? Предпочтительно что-то, что можно установить или закодировать в одном месте и применить ко всем текстовым полям по всему миру? Он также должен использовать текущие настройки культуры потока приложения (что, по-видимому, он уже делает).
Я не смог найти в настройках панели управления ничего, что позволяло бы пропустить шаг со значком. Я также нашел в Интернете несколько примеров использования TextInputPanel.CurrentInPlaceState, но когда я реализовал код для открытия TextInputPanel в фокусе предварительного просмотра главного окна, я продолжал получать исключения COM INTEROP и в основном заходил в тупик (файл Microsoft.Ink. dll — это интерактивная DLL).
Возможно ли, что есть раздел реестра, который может изменить CurrentInPlaceState по умолчанию на Expanded вместо HoverTarget? Я не смог найти ни одного в моем поиске сети.
Спасибо,
Валери
EDIT: Вот некоторый код, который я поместил в код главного окна, а также сообщение об исключении, которое я продолжаю получать, и я понятия не имею, что это значит или как это исправить (мои поисковые запросы в сети подвел меня!)
protected override void OnPreviewGotKeyboardFocus(KeyboardFocusChangedEventArgs e)
{
base.OnPreviewGotKeyboardFocus(e);
TextBox textbox = e.NewFocus as TextBox;
TextBox oldTextbox = e.OldFocus as TextBox;
if (oldTextbox != null && boxesToInputs.ContainsKey(oldTextbox))
{
TextInputPanel oldPanel = boxesToInputs[oldTextbox];
oldPanel.Dispose();
boxesToInputs.Remove(oldTextbox);
}
if (textbox != null)
{
// Make sure we've cleaned up old panels, just in case
if (boxesToInputs.ContainsKey(textbox))
{
boxesToInputs[textbox].Dispose();
boxesToInputs.Remove(textbox);
}
TextInputPanel newPanel = new TextInputPanel(((HwndSource)PresentationSource.FromDependencyObject(textbox)).Handle);
newPanel.DefaultInPlaceState = InPlaceState.Expanded;
newPanel.DefaultInputArea = PanelInputArea.Keyboard;
boxesToInputs[textbox] = newPanel;
}
}
А вот сообщение об исключении, которое возникает, когда мой код вызывает конструктор TextInputPanel:
Не удалось получить фабрику классов COM для компонента с CLSID {F9B189D7-228B-4F2B-8650-B97F59E02C8C} из-за следующей ошибки: 80040154 Класс не зарегистрирован (исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
Я проверил, что целевой платформой приложения WPF является x86. Я запустил Dependency Walker, и он сказал, что Microsoft.Ink.dll, который я использовал, был 64-разрядным, и что отсутствовали две загружаемые с задержкой зависимости (GPSVC.dll и IESHIMS.dll). Я нашел 32-разрядную версию Microsoft.Ink.dll, но по-прежнему получаю ту же ошибку, и Dependency Walker говорит то же самое — GPSVC.dll и IESHIMS.dll отсутствуют.
Я не могу ориентироваться на x64, и я бы предпочел не помещать отсутствующие библиотеки DLL в папку моего приложения (если это сработает?). Я надеюсь, что мне не хватает чего-то простого, потому что избавиться от подсказки на клавиатуре очень сложно...
Любая помощь приветствуется - я немного новичок, когда дело доходит до работы с неуправляемыми сборками/сборками взаимодействия...
TextInputPanel
, я не вижу его в Microsoft.Ink.dll? - person CodingGorilla   schedule 22.09.2011