2009-02-04 158 views
4

我正在创建UserControl,它由TextBoxListView组成。只要控件具有键盘焦点(ListView中的选择更改不应从TextBox中删除键盘焦点),我希望键盘焦点与TextBox保持一致。WPF维护键盘焦点

我试着追赶的ListViewGotKeyboardFocus并通过键盘焦点回到使用Keyboard.Focus(),TextBox但这似乎取消在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); 
     } 
    } 
} 

回答

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

这是一个黑客,但如果不是听GotKeyboardFocus事件,你听的列表框SelectionChanged事件?

+0

我试过了。在这种情况下,您可以从ListView中选择,但焦点从键盘上移除。 – 2009-02-05 20:14:24

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

你必须像特殊字符(退格等),显然为贵“的输入按键处理事情做额外的工作“或”发布“操作,但它使您可以在窗口具有焦点时使用自由格式类型,并根据需要正确处理击键。

+0

我认为这将起作用。但是,我希望将光标留在文本框中。我拍摄的功能与Visual Studio中的IntelliSense类似。 – 2009-02-05 20:16:31

0

将Focusable = false置于ListView上。从MSDN documentation

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

1

如果您是从一个WinForm调用您的WPF窗口中,您必须使用此。

多数民众赞成我是如何解决我的键盘问题。

IceX

0

好的,这让我疯狂。即使每次失去焦点时将焦点设置为UserControl,仍然无法让我的命令热键工作。我所要做的就是将房产Focusable设置为true,并且说,它工作正常!