2014-01-25 2 views
4

Кнопки работают нормально, как ожидается, нажав на них.UserControl InputBindings Работает только после нажатия кнопки

Проблема: Когда пользователь загружен в первый раз, и я не нажал ни одной кнопки в нем, Keybinds не работают. После нажатия кнопки вручную keybinds do work как и предполагалось. Так, очевидно, я хотел бы, чтобы пользователь мог использовать keybind перед любым нажатием :)

(я уже пытался установить фокус на различные элементы, такие, как сама кнопка)

Пример кода, как я настройка мои команды: (используя MVVM-легкий инструментарий)

ContextBinding

DataContext="{Binding GameInfoViewModel, Source={StaticResource Locator}}" 

Посмотреть

<UserControl.InputBindings> 
    <KeyBinding Key="Right" Command="{Binding NextCommand}"/> 
</UserControl.InputBindings> 
//... 
<mui:ModernButton Name="ModernButtonNext" IconData="{StaticResource NextIcon}" Command="{Binding NextCommand}" Margin="16 0 0 0" EllipseDiameter="24" IconWidth="14" IconHeight="14" ToolTip="Next image"/> 

ViewModel

private RelayCommand _nextCommand; 

/// <summary> 
/// Gets the NextCommand. 
/// </summary> 
public RelayCommand NextCommand 
{ 
    get 
    { 
     return _nextCommand ?? (_nextCommand = new RelayCommand(
      ExecuteNextCommand, 
      CanExecuteNextCommand)); 
    } 
} 

private void ExecuteNextCommand() 
{ 
    SelectedGameImageIndex += 1; 
} 

private bool CanExecuteNextCommand() 
{ 
    if (SelectedGameImageIndex >= GameImages.Count - 1) 
    { 
     return false; 
    } 
    return true; 
} 
+1

Для KeyBinding работы , ваше окно должно сосредоточиться на нем. Я сомневаюсь, что окно не в фокусе. –

+0

@RohitVats мое приложение - одно окно, оно загружает UserControls в виде представлений. Содержимое находится в сетке. если я помещаю пустую кнопку где-нибудь внутри этой сетки (которая не привязана или что-то еще), и я нажимаю на нее, что Keybinds там работают. – Jim

ответ

12

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

Нажатие кнопки работает с тех пор, как с помощью этого клика, userControl имеет , получил фокус, и, следовательно, привязки работали после этого.

На UserControl нагрузки, положить фокус клавиатуры на UserControl, так что входные переплеты могут работать. Вы можете поместить этот код в UserControl конструктору:

public SampleUserControl() 
    { 
     InitializeComponent(); 
     Focusable = true; 
     Loaded += (s, e) => Keyboard.Focus(this); 
    } 

Кроме того, что может быть достигнуто с помощью XAML тоже (Главное, чтобы установить Focusable Истина на UserControl):

<Window FocusManager.FocusedElement="{Binding ElementName=userControl}"> 
    <local:SampleUserControl x:Name="userControl" Focusable="True"/> 
</Window> 
+0

Работает отлично! Я застрял, пытаясь понять это в xaml с некоторыми вещами, такими как FocusManager.FocusedElement = "{Binding ElementName = input}" Спасибо кучу. – Jim

+1

Да, это тоже сработает. Проверьте обновление в ответ. –

+0

Отлично, я попробую этот подход и – Jim

Смежные вопросы