フォーカスは、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);
}
これは私が自動的に焦点を当てたばかりのテキストボックスを防ぐために知っているほとんどの「エレガント」な方法です。
あなたはどの要素にフォーカスを当てることができますか?または、テキストボックスはサイトの唯一のコントロールですか? – HimBromBeere
@HimBromBeere TextBoxの後の行の次の要素にフォーカスをプログラムで設定することができると思います。しかし、私は(私の意見では)非常に恣意的で、あまり優雅な解決策はありません。私がそれをクリックするか、タブを押すまで、最高の世界でコントロールは集中しませんでした。しかし、多分それは物事が働く方法ではありません... –