2009-09-08 125 views
5

我想從PreviewTextInput處理程序中創建一個新的控件並將焦點設置爲它。但即使在新控件上調用Focus()之後,光標仍然位於舊文本框中。 處理程序UserControl_PreviewTextInput在包含此文本框的UserControl上註冊(如果這很重要)。WPF:無法設置焦點

private void UserControl_PreviewTextInput(object sender, TextCompositionEventArgs e) 
{ 
      CodeLineControl el = new CodeLineControl(); 
      container.Children.Insert(idx+1, el); 
      el.innerTextBox.Focus(); 
} 

CodeLineControl就是這樣定義(簡體):

<UserControl ..> 
    <DockPanel Name="codeline" Background="AntiqueWhite" >   
     <TextBox Name="innerTextBox"/>  
    </DockPanel> 
</UserControl> 

有沒有對焦點()一些限制蔭不是AWRE什麼?我不允許將Focus()從PreviewTextInput處理程序中的TextBox移開?我不能將焦點放在新創建的元素上嗎?

回答

3

創建延遲

+0

這是爲什麼這是必需的?我將新控件添加到了gui中,因此它應該是可見的和可聚焦的。 – codymanix 2009-09-08 19:48:02

+0

我認爲它會在一個單獨的線程中異步呈現,並且在完成之前您無法專注於它。或者,可能是在添加新控件後,WPF會自行更改焦點。也許失落的焦點事件在某個時候被解僱了?你可以寫一個日誌文件來查看哪些控件獲得/失去焦點。 http://www.julmar.com/blog/mark/PermaLink,guid,6e4769e5-a0b3-47b2-a142-6dfefd0c028e.aspx – 2009-09-09 16:24:51

18

這之後調用關注的是文本框一個DispatcherTimer是擴展方法,而不是我使用的焦點:

public static void BackgroundFocus(this UIElement el) 
    { 
     Action a =() => el.Focus(); 
     el.Dispatcher.BeginInvoke(DispatcherPriority.Background, a); 
    } 

無需創建一個定時器。

+2

偉大的解決方案! +1 – Dabblernl 2009-12-06 22:51:15

+0

我偷你的codez!我改名爲['FocusLikeChuckNorris'](http://www.chucknorrisfacts.com)! (1) – 2011-09-19 18:45:05