WPF TextBox Перехват RoutedUICommands

В моем случае в build.gradle модуля назначение mainClassName должно указывать полное имя класса, т. е. как указано в имени пакета в файле исходного кода основного класса.

11
задан Community 23 May 2017 в 12:09
поделиться

6 ответов

Нет простого способа подавить все привязки, не устанавливайте для 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;
}
10
ответ дан 3 December 2019 в 08:04
поделиться

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.

0
ответ дан 3 December 2019 в 08:04
поделиться

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

<MenuItem Command="ApplicationCommands.Open"
          CommandTarget="{Binding ElementName=UIRoot}"
          Header="_Open" />
0
ответ дан 3 December 2019 в 08:04
поделиться

] Событие 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).

0
ответ дан 3 December 2019 в 08:04
поделиться

Элемент управления 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;
}
0
ответ дан 3 December 2019 в 08:04
поделиться

Если вы хотите реализовать свою собственную отмену / возврат и предотвратить перехват 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;
    }
}
5
ответ дан 3 December 2019 в 08:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: