WPF维护键盘焦点

时间:2009-02-04 19:26:30

标签: c# wpf keyboard focus

我正在创建一个由UserControlTextBox组成的ListView。我希望键盘焦点保持在TextBox,只要控件具有键盘焦点(ListView中的选择更改不应该从TextBox移除键盘焦点)。

我尝试在GotKeyboardFocus中抓取ListView并使用TextBox将键盘焦点传回Keyboard.Focus(),,但这似乎取消ListView中的任何选择操作1}}。以下代码显示了问题。有谁知道如何实现这个功能?

<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 个答案:

答案 0 :(得分:3)

相反,您是否考虑过捕获击键并将这些击键放入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();
}

你必须为特殊字符(退格键等)做任何额外的工作,显然是你的“Enter”或“Post”操作的Key处理程序,但是它使你能够只使用自由格式而窗口具有焦点,并在必要时正确处理击键。

答案 1 :(得分:2)

看起来可以在MouseUp事件中更改焦点。我想如果你做得太早,比如在GotKeyboardFocus事件中,你会在listview处理事件并选择所选项目之前窃取焦点。

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

答案 2 :(得分:1)

如果从WinForm调用WPF窗口,则必须使用:

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

来自MSDN documentation

这就是我解决键盘问题的方法。

ICEX

答案 3 :(得分:0)

这是一个黑客攻击,但是如果不是监听GotKeyboardFocus事件,你会在ListBox上监听SelectionChanged事件呢?

答案 4 :(得分:0)

将Focusable = false放在ListView上。

答案 5 :(得分:0)

好的,这让我发疯了。即使每次失去焦点都将焦点设置为UserControl,仍然无法使我的命令热键工作。我所要做的就是将属性Focusable设置为true,瞧,它正在工作!