2017-03-20 6 views
0

タブごとにTextBoxを含むTabControlがあります。プログラムでタブを選択し、TextBoxの選択を設定し、TextBoxにフォーカスを設定する必要があります。WPFは複数のプロパティを1つずつ変更しています。

私の問題は、最初にコード内の新しいタブを選択し、テキストボックスにフォーカスを設定しても機能しないということです。

希望のタブが既に選択されたタブであり、タブ内のテキストボックスにフォーカスを設定している場合、それは機能しています。

WPF要素でいくつかのアクションを実行すると動作しないようです。

タブコントロールのタブを最初に切り替えて、新しく選択したTabItemの子にフォーカスを設定する正しい方法は何ですか?


編集:完了するために、レンダリングスレッドを待っている:私は、インターネット上で何か見つけた

https://social.msdn.microsoft.com/Forums/vstudio/en-US/693fbedb-efa6-413e-ab66-530c6961d3fb/how-to-wait-for-the-wpf-render-thread-to-catch-up?forum=wpf

Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new Action(() => { })).Wait(); 

をしかし、これは正しい方法ですか?

ところで:

Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new Action(() => { })).Wait(); 
Dispatcher.Invoke(DispatcherPriority.ApplicationIdle, new Action(() => { })); 
+0

* * "WPF要素のいくつかのアクションを実行することはできません" - いつ、どのようあなたがそれを行うことが決まります。私たちを見せてもらえますか? – Sinatr

+0

フォーカス変更がディスパッチャで後で発生するようにスケジュールする必要がある場合があります。タブの変更による実際のビジュアルツリーの変更は同期的ではなく、「ディスパッチされたスレッドが再びフリーになるたびに」発生することがあります。したがって、タブの変更後にフォーカスを設定しようとすると、テキストボックスはまだ表示されません。それだけでフォーカスを受け取ることはできません。 – Joey

+0

あなたは[単独]ではないようです(http://stackoverflow.com/q/4553412/1997232)。それでも、[mcve](https://stackoverflow.com/help/mcve)を持っていると、誰かがこの問題を解決しようとするかもしれません。 – Sinatr

答えて

0

FocusManager.SetFocusedElement()メソッドを使用します。違いは何ですか。

フォーカスにはいくつかのニュアンスがあります(you can learn more here)。

XAML

<TabControl> 
    <TabItem Header="One" 
      x:Name="tabOne"> 
     <Button HorizontalAlignment="Center" 
       VerticalAlignment="Center" 
       Content="Set Focus" 
       Click="Button_Click" /> 
    </TabItem> 
    <TabItem Header="Two" 
      Name="tabTwo"> 

     <StackPanel> 
      <TextBox Name="txtOne" /> 
      <TextBox Name="txtTwo" /> 
     </StackPanel> 
    </TabItem> 
    <TabItem Header="Three" 
      x:Name="tabThree"> 
     <StackPanel> 
      <TextBox Name="txtThree" /> 
      <TextBox Name="txtFour" /> 
     </StackPanel> 
    </TabItem> 
</TabControl> 

CODE

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    tabTwo.IsSelected = true; 
    FocusManager.SetFocusedElement(tabTwo, txtTwo); 

} 
関連する問題