WPF: Как я могу отправить ключи на другой элемент управления, не отвлекаясь от целевого элемента управления - PullRequest
1 голос
/ 10 марта 2010

Я следил за этим вопросом , и он работает хорошо, но это отвлекает внимание от моего контроля отправки.

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

 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 выше - это всплывающий элемент управления, и фокус переводится, как только я вызываю RaiseEvent.

1 Ответ

1 голос
/ 10 марта 2010

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

 <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;
            }
        }
    }

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

Это не 'чувствует' правильно ... но это работает для меня.

...