2010-03-09 4 views
1

Я следил за this question, и он работает хорошо, но он убирает фокус с моего передающего элемента управления.WPF: Как я могу отправить клавиши на другой элемент управления, не отвлекаясь от целевого элемента управления.

Что я пытаюсь сделать, так это создать поле ввода, которое будет работать как текстовое поле с автозаполнением - текстовое поле и элемент управления всплывающим меню, содержащий список соответствующих элементов. Мне нужно иметь возможность брать ключи, такие как «Вверх», «Вниз», «Направить» и «Направить» на панель управления всплывающим меню, а также взять другие клавиши и сохранить их в текстовом поле.

switch (e.Key) 
     { 
      case Key.Down: 
      { 
       if (!popup.IsOpen) 
       { 
        openPopup(); 
       } 
       else 
       { 
        PresentationSource source = PresentationSource.FromVisual(itemList); 
        if (source == null) return; 

        itemList.RaiseEvent(
         new KeyEventArgs(Keyboard.PrimaryDevice, source, 0, e.Key) 
          {RoutedEvent = Keyboard.KeyDownEvent}); 

       } 
       break; 
      } 
     } 

ITEMLIST выше, является контроль, который pop'd и фокус получает переданы, как только я называю RaiseEvent.

ответ

1

Ну кажется, это довольно легко ..

<StackPanel> 
    <Controls:SearchTextBox x:Name="searchBox" SearchMode="Instant" 
           PreviewKeyDown="onSearchBoxPreviewKeyDown" 
           KeyDown="onKeyDown" 
           Search="onSearch" Margin="5" /> 
    <Popup Name="popup" > 
     <ListBox x:Name="itemList" 
       SelectionMode="Extended" 
       KeyDown="onItemListKeyDown" 
       PreviewKeyDown="onPreviewItemListKeyDown" 
       /> 
    </Popup> 
</StackPanel> 

В onPreviewItemListKeyDown сделать следующим

private void onPreviewItemListKeyDown(object sender, KeyEventArgs e) 
    { 
     switch (e.Key) 
     { 
      case Key.Down: 
      case Key.Up: 
      case Key.Enter: 
      case Key.Escape: 
      case Key.Space: 
      { 
       // swallow 
       break; 
      } 
      default: 
      { 
       searchBox.Focus(); 
       return; 
      } 
     } 
    } 

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

Это не «правильно», но оно работает для меня.

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