Как заблокировать или отключить ярлыки окна, когда курсор находится в текстовом поле? - PullRequest
1 голос
/ 10 мая 2019

У меня есть приложение C # WPF и окно с контролем ленты и текстовым полем.Лента определяет множество сочетаний клавиш для окна, например, F1 , D и т. Д. Когда курсор находится в текстовом поле, нажатие клавиши D вызывает вызовФункция связана с этим ярлыком, поэтому невозможно ввести символ "D" в текстовое поле.Кто-нибудь, кто знает, как решить эту проблему?

Я пытался переопределить событие PreviewKeyDown, также выяснить, какие события были вызваны нажатием клавиши, и манипулировать ими, но безрезультатно.

1 Ответ

0 голосов
/ 10 мая 2019

Вот быстрый и грязный пример, предназначенный для того, чтобы дать представление о том, как обычно реализованы сочетания клавиш.

Очевидно.

Это очень упрощено, и моя команда мало что делает.

Вы можете ввести D в любое текстовое поле, без проблем.

Разметка в главном окне.

<Window.DataContext>
    <local:MainWindowViewModel/>
</Window.DataContext>
<Window.InputBindings>
    <KeyBinding Key="D"
          Modifiers="Alt" 
          Command="{Binding MyDcommand}" />
</Window.InputBindings>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Ribbon>
        <RibbonGroup>
            <TextBox Text="Hello"/>
        </RibbonGroup>
    </Ribbon>
    <TextBox Height="30" 
             Width="100"
             Grid.Row="1"/>
</Grid>

Я использую mvvmlight в модели представления, поэтому легко определить icommands.

using GalaSoft.MvvmLight.CommandWpf;
namespace wpf_99
{
public class MainWindowViewModel : BaseViewModel
{
    private RelayCommand myDcommand;
    public RelayCommand MyDcommand
    {
        get
        {
            return myDcommand
            ?? (myDcommand = new RelayCommand(
              () =>
              {
                  Console.WriteLine("It worked OK");
              }
             ));
        }
    }

Когда я нажимаю Alt + D, команда запускает, находится ли текстовое поле в фокусе или нет.

Команда имеет область видимости для окна, а не только для ленты.Так что это работает, если фокус находится где-нибудь в окне.

И я могу набрать D

enter image description here

...