В моем случае в build.gradle модуля назначение mainClassName должно указывать полное имя класса, т. е. как указано в имени пакета в файле исходного кода основного класса.
Нет простого способа подавить все привязки, не устанавливайте для IsUndoEnabled
значение false
, так как это будет только захват и сброс Ctrl + Привязка ключа Z . Вам необходимо перенаправить CanUndo
, CanRedo
, Отменить
и Повторить
. Вот как я это делаю с моим синглтоном UndoServiceActions
.
textBox.CommandBindings.Add(new CommandBinding(ApplicationCommands.Undo,
UndoCommand, CanUndoCommand));
textBox.CommandBindings.Add(new CommandBinding(ApplicationCommands.Redo,
RedoCommand, CanRedoCommand));
private void CanRedoCommand(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = UndoServiceActions.obj.UndoService.CanRedo;
e.Handled = true;
}
private void CanUndoCommand(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = UndoServiceActions.obj.UndoService.CanUndo;
e.Handled = true;
}
private void RedoCommand(object sender, ExecutedRoutedEventArgs e)
{
UndoServiceActions.obj.UndoService.Redo();
e.Handled = true;
}
private void UndoCommand(object sender, ExecutedRoutedEventArgs e)
{
UndoServiceActions.obj.UndoService.Undo();
e.Handled = true;
}
TextBoxBase
(and thus TextBox
and RichTextBox
) have IsUndoEnabled
property, defaulting to true
. If you set it to false
(and you can event do it for all textboxes on your window via a style and a setter, as usual), then they will not intercept Ctrl+Z.
По умолчанию целью RoutedUICommand
является элемент с фокусом клавиатуры. Однако вы можете установить CommandTarget
на элементе управления, испускающем команду, чтобы изменить корневой элемент, который получает команду.
<MenuItem Command="ApplicationCommands.Open"
CommandTarget="{Binding ElementName=UIRoot}"
Header="_Open" />
] Событие Executed всплывает, поэтому событие Window Executed всегда будет выполнено после события TextBox Executed. Попробуйте изменить его на PreviewExecuted, и это должно иметь огромное значение. Кроме того, вам может потребоваться подключить CanExecute для вашего окна. т.е.:
<CommandBinding Command="Undo" PreviewExecuted="MyUndo_Executed" CanExecute="SomeOtherFunction"/>
private void SomeOtherFunction(object sender, ExecutedRoutedEventArgs e) { e.CanExecute=true; }
Конечно, вам, вероятно, понадобится некоторая логика, чтобы определить, когда CanExecute следует установить в значение true. Вам, вероятно, также не нужно использовать пользовательскую команду (просто используйте встроенную команду Undo).
Элемент управления TextBox
предоставляет IsUndoEnabled
собственность, которую вы
можно установить на false
, чтобы запретить функцию отмены. (Если IsUndoEnabled
равно истина
, нажатие клавиши Ctrl + Z ] запускает его.)
Также для элемента управления, который не предоставляет специальное свойство, вы можете добавить новую привязку для команды, которую хотите отключить. Эта привязка
затем может предоставить новый обработчик событий CanExecute
, который всегда отвечает false. Вот
пример, в котором используется этот метод для удаления поддержки функции вырезания текстового поля:
CommandBinding commandBinding = new CommandBinding(
ApplicationCommands.Cut, null, SuppressCommand);
txt.CommandBindings.Add(commandBinding);
, а здесь обработчик событий, который устанавливает состояние CanExecute
:
private void SuppressCommand(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = false;
e.Handled = true;
}
Если вы хотите реализовать свою собственную отмену / возврат и предотвратить перехват TextBox, прикрепите к события предварительного просмотра команды через CommandManager.AddPreviewCanExecuteHandler
и CommandManager.AddPreviewExecutedHandler
и установите для флага event.Handled значение true:
MySomething()
{
CommandManager.AddPreviewCanExecuteHandler(
this,
new CanExecuteRoutedEventHandler(OnPreviewCanExecuteHandler));
CommandManager.AddPreviewExecutedHandler(
this,
new ExecutedRoutedEventHandler(OnPreviewExecutedEvent));
}
void OnPreviewCanExecuteHandler(object sender, CanExecuteRoutedEventArgs e)
{
if (e.Command == ApplicationCommands.Undo)
{
e.CanExecute = true;
e.Handled = true;
}
else if (e.Command == ApplicationCommands.Redo)
{
e.CanExecute = true;
e.Handled = true;
}
}
void OnPreviewExecutedEvent(object sender, ExecutedRoutedEventArgs e)
{
if (e.Command == ApplicationCommands.Undo)
{
// DO YOUR UNDO HERE
e.Handled = true;
}
else if (e.Command == ApplicationCommands.Redo)
{
// DO YOUR REDO HERE
e.Handled = true;
}
}