我正在创建一个由UserControl
和TextBox
组成的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);
}
}
}
答案 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();
这就是我解决键盘问题的方法。
ICEX
答案 3 :(得分:0)
这是一个黑客攻击,但是如果不是监听GotKeyboardFocus事件,你会在ListBox上监听SelectionChanged事件呢?
答案 4 :(得分:0)
将Focusable = false放在ListView上。
答案 5 :(得分:0)
好的,这让我发疯了。即使每次失去焦点都将焦点设置为UserControl
,仍然无法使我的命令热键工作。我所要做的就是将属性Focusable
设置为true
,瞧,它正在工作!