2015-11-09 9 views
5

私のアプリケーションナビゲーションの例としてuwp navigation exampleを使用します。私はTextBoxに焦点を当てる必要があります。私はuwp navigation exampleで試してみる。 BasicPageの場合、次のコードを追加します。Uwpナビゲーションの例とコントロールに焦点を合わせる

<StackPanel Orientation="Vertical"> 
     <TextBox x:Name="Test" /> 
     <TextBox x:Name="Test1" /> 
    </StackPanel> 

    public BasicPage() 
    { 
     this.InitializeComponent(); 
     this.Loaded += BasicPage_Loaded; 
    } 

    private void BasicPage_Loaded(object sender, RoutedEventArgs e) 
    { 
     Test1.Focus(FocusState.Programmatic); 
    } 

Test1はフォーカスを受け取りません。私はこのコードを "普通の" Windowsの普遍的なアプリケーションで試しています - それは仕事です。何をアドバイスしますか?

答えて

6

これは、Test1.Focusを呼び出した後、フォーカス関数が別の場所で呼び出されるためです。

AppShell.xaml.csでは、次のコードを見つけることができます:

private void OnNavigatedToPage(object sender, NavigationEventArgs e) 
{ 
    // After a successful navigation set keyboard focus to the loaded page 
    if (e.Content is Page && e.Content != null) 
    { 
     var control = (Page)e.Content; 
     control.Loaded += Page_Loaded; 
    } 
} 

private void Page_Loaded(object sender, RoutedEventArgs e) 
{ 
    ((Page)sender).Focus(FocusState.Programmatic); 
    ((Page)sender).Loaded -= Page_Loaded; 
    this.CheckTogglePaneButtonSizeChanged(); 
} 

上記のコードは、ページに移動するとき、それはページロードイベントをサブスクライブしてページにフォーカスを設定することを意味します。

あなたのコードは、ページ自体でページがロードされたイベントを購読します。そしてあなたのコードはAppShellのPage_Loaded関数の前に実行されます。だからあなたはあなたが望むものを手に入れませんでした。

したがって、Page_Loaded機能で((Page)sender).Focus(FocusState.Programmatic);をコメントアウトするだけです。あなたはあなたが望むものを手に入れます。私はその行の正確な目的が何であるか分かりません。しかし、すべてが良いようです。

この行をコメントアウトして何か問題が見つかった場合は、その行を処理することもできます。ロードされたイベントの後、LayoutUpdatedイベントでフォーカス関数を1回呼び出します。

public sealed partial class BasicPage : Page 
{ 
    bool bAfterLoaded = false; 
    public BasicPage() 
    { 
     this.InitializeComponent(); 
     this.Loaded += BasicPage_Loaded; 
     this.LayoutUpdated += BasicPage_LayoutUpdated; 
    } 

    private void BasicPage_LayoutUpdated(object sender, object e) 
    { 
     if (bAfterLoaded) 
     { 
      Test1.Focus(FocusState.Programmatic); 
      bAfterLoaded = !bAfterLoaded; 
     } 
    } 

    private void BasicPage_Loaded(object sender, RoutedEventArgs e) 
    { 
     bAfterLoaded = !bAfterLoaded; 
    } 
} 

希望すると、これが役立ちます。

+0

ありがとうございます。 BasicPage_LayoutUpdatedを使った作業です。 – FetFrumos

0

プログラムでテキストボックスのフォーカスを調整する場合。レイアウト更新イベントが発生しないようにキーボードの表示を禁止する。あなたは何かを行うことができます 次にpage_loadedイベントで行うTest1.Focus(FocusState.Programmatic);

関連する問題