2 Stimmen

WPF : Wie kann ich Tasten an ein anderes Steuerelement senden, ohne den Fokus vom Zielsteuerelement wegzunehmen

Ich habe die この質問 und es funktioniert gut, aber es lenkt von meiner Sendekontrolle ab.

Ich versuche, ein Eingabefeld zu erstellen, das wie ein Textfeld mit automatischer Vervollständigung funktioniert - ein Textfeld und ein Popup-Steuerelement, das die Liste der passenden Elemente enthält. Ich muss in der Lage sein, Tasten zu nehmen, wie Up, Down und leiten sie an das Popup-Steuerelement, und nehmen Sie die anderen Tasten und halten sie auf das Textfeld.

 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 oben ist das Steuerelement, das aufpoppt und der Fokus wird übertragen, sobald ich RaiseEvent aufrufe.

1voto

headsling Punkte 633

Nun, es scheint ziemlich einfach zu sein

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

In der onPreviewItemListKeyDown-Anweisung tun Sie Folgendes

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

Für jede Taste, die Sie nicht im Popup-Steuerelement bearbeiten möchten, setzen Sie einfach den Fokus auf Ihr ursprüngliches Steuerelement zurück. Da wir dies auf dem Vorschau-Tasten-Ereignis tun, wird die Taste nach unten sogar an mein Suchfeld-Steuerelement geliefert.

Das fühlt sich nicht richtig an, aber für mich funktioniert es.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X