Search code examples
c#xamlfocusautosuggestwindows-10-mobile

Programmatically set focus when a control becomes visible


I have an AutoSuggestBox which is only shown when I click a button. When the AutoSuggestBox becomes visible it should also receive focus.

I tried many ways but none of them worked.

The code I have:

 <AutoSuggestBox x:Name="AutoSearchBar" 
      HorizontalAlignment="Right" 
      VerticalAlignment="Center" 
      PlaceholderText="Text to find" 
      Visibility="Collapsed"/>

 <Button x:Name="searchButton" 
      Visibility="Visible" 
      HorizontalAlignment="Right"
      FontFamily="Segoe MDL2 Assets" 
      Background="Red"
      Content="&#xE094;"
      Click="searchButton_Click"/>

Code Behind:

  private void searchButton_Click(object sender, RoutedEventArgs e)
  {
      AutoSearchBar.Visibility = Visibility.Visible;
      searchButton.Visibility = Visibility.Collapsed;
  }

I tried to put this in code-behind searchButton_Click, but the AutoSearchBar control only appears and is not focused.

         AutoSearchBar.Focus(FocusState.Keyboard);
         AutoSearchBar.Focus(FocusState.Pointer);
         AutoSearchBar.Focus(FocusState.Programmatic);

Solution

  • Sometimes XAML for Windows 10 (and 8.1 RT) behaves oddly. Bringing in a small delay usually fixes it. I've tried to run it through a Task factory and it works on my machine (TM).

    private void searchButton_Click(object sender, RoutedEventArgs e)
    {
        searchButton.Visibility = Visibility.Collapsed;
        AutoSearchBar.Visibility = Visibility.Visible;
    
        // slightly delay setting focus
        Task.Factory.StartNew(
            () => Dispatcher.RunAsync(CoreDispatcherPriority.Low,
                () => AutoSearchBar.Focus(FocusState.Programmatic)));
    }