4

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

我已经尝试捕获GotKeyboardFocus并将ListView键盘焦点传递回TextBoxusingKeyboard.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);
        }
    }
}
4

6 回答 6

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 处理程序,但它使您能够在 Window 时自由输入有焦点并在必要时正确处理击键。

于 2009-02-04T20:49:50.150 回答
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();
}
于 2009-02-04T21:20:52.350 回答
2

如果你从 WinForm 调用你的 WPF 窗口,你必须使用这个:

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

来自MSDN 文档

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

冰X

于 2011-01-17T20:11:11.047 回答
0

这是一个 hack,但是如果您不听 GotKeyboardFocus 事件,而是听 ListBox 上的 SelectionChanged 事件怎么办?

于 2009-02-04T19:29:25.880 回答
0

将 Focusable=false 放在您的 ListView 上。

于 2009-04-04T16:20:08.807 回答
0

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

于 2011-05-07T01:41:01.747 回答