WPF сохранить фокус клавиатуры - PullRequest
4 голосов
/ 04 февраля 2009

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

Я пытался перехватить GotKeyboardFocus в ListView и передать фокус клавиатуры обратно на TextBox, используя Keyboard.Focus(),, но, похоже, это отменяет любую операцию выбора в ListView. Код ниже показывает проблему. Кто-нибудь знает, как добиться этой функциональности?

<Window x:Class="WpfApplication5.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <StackPanel>
        <TextBox x:Name="TextBox1" />
        <ListView x:Name="ListBox1" Keyboard.GotKeyboardFocus="ListBox1_GotKeyboardFocus">
            <ListViewItem Content="Able" />
            <ListViewItem Content="Baker" />
            <ListViewItem Content="Charlie" />
        </ListView>
    </StackPanel>
</Window>

using System.Windows;
using System.Windows.Input;

namespace WpfApplication5
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void ListBox1_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
        {
            Keyboard.Focus(TextBox1);
        }
    }
}

Ответы [ 6 ]

3 голосов
/ 04 февраля 2009

Вместо этого, рассматривали ли вы просто захват клавиш и ввод этих нажатий в TextBox?

<Window PreviewKeyDown="Window_PreviewKeyDown" >
    <Grid>
        <TextBox x:Name="TextBox1" />
        <ListBox />
    </Grid>
</Window>

Тогда в коде вашего окна:

private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
   TextBox1.Text += e.Key.ToString();
}

Вам придется проделать дополнительную работу для чего-либо, например, для специальных символов (backspace и т. Д.), И, очевидно, для обработчика клавиш для операции «Ввод» или «Опубликовать», но это дает вам возможность просто вводить произвольные формы. в то время как окно имеет фокус и правильно обрабатывать нажатия клавиш при необходимости.

2 голосов
/ 05 февраля 2009

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

<StackPanel>
    <TextBox x:Name="TextBox1" />
    <ListView x:Name="ListBox1" MouseUp="ListBox1_MouseUp">
        <ListViewItem Content="Able" />
        <ListViewItem Content="Baker" />
        <ListViewItem Content="Charlie" />
    </ListView>
</StackPanel>

private void ListBox1_MouseUp(object sender, MouseButtonEventArgs e)
{
    TextBox1.Focus();
}
1 голос
/ 17 января 2011

Если вы вызываете свое окно WPF из WinForm, вы должны использовать это:

System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(wpfWindow);
wpfWindow.show();

из документации MSDN .

Так я решил проблему с клавиатурой.

ICEX

0 голосов
/ 07 мая 2011

Хорошо, это сводило меня с ума. Даже если установить фокус на UserControl каждый раз, когда он потерял фокус, все равно не удалось заставить мои командные горячие клавиши работать. Все, что мне нужно было сделать, это установить для свойства Focusable значение true и вуаля, оно работает!

0 голосов
/ 04 апреля 2009

Поместите Focusable = false в свой ListView.

0 голосов
/ 04 февраля 2009

Это хак, но что если вместо прослушивания события GotKeyboardFocus вы прослушаете событие SelectionChanged в ListBox?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...