Подтвердить что ты не робот

Текстовое поле WPF не позволяет отменить при размещении в ElementHost в надстройке VSTO/Outlook

У меня есть Outlook addin (VSTO), в области формы Outlook У меня есть пользовательский элемент управления WPF в ElementHost. У меня есть проблема, что TextBox внутри моего пользовательского элемента управления не имеет возможности отмены... в некоторых конфигурациях. В частности, в Windows 7/Outlook 2007 отменить (т.е. Ctrl-Z) не работает, даже если Cut/Copy и т.д. Все работают. Интересно, что Windows 8/Outlook 2010 отменяет работу.

TextBox XAML:

<TextBox 
    Name="txtnote" 
    VerticalScrollBarVisibility="Auto" 
    SpellCheck.IsEnabled="True"  
    Text="Topic notes..." 
    TextWrapping="Wrap" 
    AcceptsReturn="True" />

Примечание. Я попытался установить следующие атрибуты, чтобы заставить его работать, но безрезультатно: IsUndoEnabled = "True" UndoLimit = "- 1"

Может кто-нибудь предположить, почему это происходит, и что я могу сделать, чтобы он работал, как ожидалось?

ОБНОВЛЕНИЕ 7 января 2014 г. Я добавил в текстовое поле следующие KeyBindings:

<TextBox.InputBindings>
    <KeyBinding Command="ApplicationCommands.Undo" Key="Z" Modifiers="Control" />
    <KeyBinding Command="ApplicationCommands.Redo" Key="Y" Modifiers="Control" />
    <KeyBinding Command="ApplicationCommands.Undo" Key="G" Modifiers="Alt" />
</TextBox.InputBindings>

И результат - Cntl-Z/Cntrl-Y по-прежнему не работает, однако Alt-G работает!

4b9b3361

Ответ 1

Плагинам не разрешено обрабатывать ярлыки основных Excel. Вероятно, из-за этого ярлыки не работают.

Ответ 2

Попробуйте уведомить окна о том, что значение текущего элемента управления (текстовое поле) было изменено, возможно, в текстовом изменении, как показано ниже. (не пробовал, но применил мой контроль в аналогичном сценарии, где элементы управления не смогли идентифицировать модификацию)

Библиотека методов............

[DllImport("user32.dll", EntryPoint = "SendMessageW", SetLastError = true)]
public static extern IntPtr SendMessageW([InAttribute] IntPtr hWnd, IntPtr msg, IntPtr wParam, IntPtr lParam);

//Текущий дескриптор для textBox

IntPtr _handle

//Устанавливает или очищает флаг изменения для элемента управления редактированием. Флаг изменения указывает, был ли изменен текст в редакторе редактирования. Вы можете отправить это сообщение либо в элемент управления редактирования, либо в расширенный элемент управления редактирования.

int SETMODIFY = 185,//0x00B9 (constant)

//При изменении текста

SendMessageW(_handle, new IntPtr(SETMODIFY), IntPtr.Zero, IntPtr.Zero);