2016-12-16 5 views
1

最も簡単なアプリケーション:アプリケーション起動時に要素をフォーカスしない方法は?可能

<Page 
    x:Class="TestApp.MainPage" 
    ...> 
    <Grid> 
     <TextBox /> 
    </Grid> 
</Page> 

質問:起動アプリケーション上のTextBoxに設定されているから、カーソル(フォーカス)を防ぐために、任意のエレガントな方法はありますか?

拡大する:実際の問題は、TextBoxがフォーカスを受け取ったときに開くPopUpがあることです。 PopUp内の要素をクリックすると閉じられるはずですが、TextBoxが最初のフォーカス可能な要素であるため、自動的にフォーカスを受け取り、ポップアップが直ちに再び開きます。私が思う問題の中核は、上記の例で表されます。

+0

あなたはどの要素にフォーカスを当てることができますか?または、テキストボックスはサイトの唯一のコントロールですか? – HimBromBeere

+0

@HimBromBeere TextBoxの後の行の次の要素にフォーカスをプログラムで設定することができると思います。しかし、私は(私の意見では)非常に恣意的で、あまり優雅な解決策はありません。私がそれをクリックするか、タブを押すまで、最高の世界でコントロールは集中しませんでした。しかし、多分それは物事が働く方法ではありません... –

答えて

1

フォーカスは、IsTabStop,TabIndex,IsHitTestVisible、およびFocusManagerクラスなどのさまざまなプロパティによって管理されます。一度ウィンドウがアクティブになると、最初のフォーカス可能な要素にフォーカスを当てるための組み込みの機能があり、この動作は一般的にはカスタマイズできません。

我々は、たとえば、のようなページ自体を代わりにテキストボックスを集中するために、異なる要素を指定することもできます

<Page IsTabStop="True"> 
    <TextBox/> 
</Page> 

このページではなくテキストボックスの初期フォーカスを取得することで動作しますが、今のページやや望ましくないタブビヘイビアに参加します。

通常、フレームワークは、RootScrollViewerがタブストップではない(タブでフォーカスを受け取ることができない)場合でも、フォーカスのあるコントロールをクリックすると、RootScrollViewerにフォーカスを設定します。ページのロード時にRootScrollViewerにフォーカスを当てることができる場合、フレームワークはの何かにフォーカスがあることを検出し、のフォーカスを取得し、最初の要素をフォーカスしようとしません。

<Page Loaded="onPageLoaded"> 
    <TextBox/> 
</Page> 
private ScrollViewer getRootScrollViewer() 
{ 
    DependencyObject el = this; 
    while (el != null && !(el is ScrollViewer)) 
    { 
     el = VisualTreeHelper.GetParent(el); 
    } 

    return (ScrollViewer)el; 
} 

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

これは私が自動的に焦点を当てたばかりのテキストボックスを防ぐために知っているほとんどの「エレガント」な方法です。

+0

これは私が好きです、ありがとう! –

+0

私はあなたのRootScrollViewerコードを使用し、それをビヘイビアでラップしました。今では初期のフォーカスを無効にしたいページがあれば、そのページにビヘイビアを添付します。魅力のように動作します。ありがとう! – ManOVision

関連する問題