Как перехватить ввод с клавиатуры из всплывающего элемента управления - PullRequest
3 голосов
/ 26 января 2011

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

1 Ответ

1 голос
/ 26 января 2011

A Popup по умолчанию не фокусируется, и даже если он фокусируемый, вы должны иметь что-то еще, что можно сфокусировать на всплывающем окне, а затем сфокусировать или выделить его, чтобы оно получало событие клавиатуры.

Другими словами, если вы хотите получить событие клавиатуры от Popup, используйте Focusable="True" и установите фокусируемый элемент управления, например TextBox, или Button, или ListBox, и пусть пользователь даст емусфокусируйтесь, щелкнув по нему или вручную используя Focus() из кода.Если вы сделаете все это, то PreviewKeyDown должно сработать для Popup.

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

<Grid>
    <StackPanel>
        <Slider Name="slider1"/>
        <ToggleButton x:Name="toggleButton1" 
                      Content="Open Popup"/>
    </StackPanel>
    <Popup PlacementTarget="{Binding ElementName=toggleButton1}" 
           IsOpen="{Binding IsChecked, ElementName=toggleButton1, Mode=OneWay}" 
           Focusable="True">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="PreviewKeyDown">
                <ei:ChangePropertyAction TargetObject="{Binding ElementName=slider1}" 
                                         PropertyName="Value" 
                                         Value="1" 
                                         Increment="True"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
        <TextBox Background="White" 
                 Focusable="True">
            <TextBox.Text>Sample Popup content.</TextBox.Text>
        </TextBox>
    </Popup>
</Grid>
...