2011-09-22 71 views
2

我想將焦點設置爲第一個是文本框的ListBox項目。我希望能夠立即寫入它,而不需要單擊它或按任意鍵。我嘗試這一點,但不起作用:嵌入ListBox初始焦點的textBox

 private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     listBox1.Items.Add(new TextBox() { }); 
     (listBox1.Items[0] as TextBox).Focus(); 

    } 
+0

你現在是否得到'NullReferenceException'? –

+0

@BalaR nop。我不能直接寫,我需要點擊控制或按Tab鍵。 – mjsr

+1

嘗試顯示事件而不是加載? –

回答

4

這是愚蠢的,但它只能如果你稍等一下,試試這個版本:

using System; 
using System.Windows; 
using System.Windows.Controls; 

namespace WpfApplication1 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 
      var textBox = new TextBox() {}; 
      listBox1.Items.Add(textBox); 

      System.Threading.ThreadPool.QueueUserWorkItem(
       (a) => 
       { 
        System.Threading.Thread.Sleep(100); 
        textBox.Dispatcher.Invoke(
         System.Windows.Threading.DispatcherPriority.Normal, 
         new Action(
          delegate() 
          { 
           textBox.Focus(); 
          } 
          )); 
       } 
       ); 
     } 
    } 
} 

我在本地測試和無法修復它,直到我發現有這個問題,fuzquat答案所以在這裏投我和他有:d

Can't set focus to a child of UserControl

+2

WTF它的工作原理! XD ...也許在將來我會試着理解它,知道我要使用它,謝謝 – mjsr

0

在任何情況下,身體人有這個問題。 UIElement必須完全加載才能將其聚焦。因此這可以做得非常簡單:

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    listBox1.Items.Add(new TextBox() { }); 
    var txBox = listBox1.Items[0] as TextBox; 
    txBox.Loaded += (txbSender, args) => (txbSender as TextBox)?.Focus(); 
}