TOC

This article is currently in the process of being translated into Japanese (~95% done).

Control concepts:

Tab Order

プログラミングを学習するために長い間コンピュータを使っていると知っているとは思いますが、ウィンドウやダイアログを操作する時にキーボードのTabキーが使えます。これはフォームに記入するときなどに、次の欄やコントロールを選ぶためにマウスを使わないのでキーボードから手を離さなくてすみます。

WPFはこの動作を標準でサポートしています。さらに、WPFは一つのフィールドから他のフィールドに移ったときに自動的にタブオーダーを設定するので、一般的に、このことに関しては全く心配いりません。しかし、時々、ウインドウやダイアログのデザインは、いろいろな理由であなたの意図しないタブオーダーになります。また、特定のコントロールをタブオーダーから外したい場合もあります。例を使ってこれを説明します。

このダイアログは中央を分割するGridがあり、両側にラベルとテキストボックスを含んでいる StackPanelがあります。デフォルトのタブオーダーはウィンドウの最初のコントロールから始まって、次のコントロールに移る前に、その子コントロールに移ります。ダイアログは垂直方向にスタックする StackPanelからなるため、First name フィールドから始まって、Last nameZip code フィールドを含む二番目のStackPanelに移る前に、Street name フィールド、Cityフィールドに移ります。 2つ目のStackPanelからタブで抜けると初めて二つのボタンに到達します。

しかし、これは私が望む動作ではありません。私が望むタブオーダーは、First name から Last name へ移ります(基本的に垂直ではなく水平方向です)。その上、City フィールドは Zip code に基づいて自動的に入力するので、これは仮想的で読み取り専用になっていて、タブで移動したくありません。これらを実現するため、二つのプロパティ、TabIndexIsTabStop を使います。TabIndexは順序を定義し、一方、IsTabStopプロパティはWPFがタブをスキップするように設定します。これがダイアログを生成するマークアップです。

<Window x:Class="WpfTutorialSamples.Control_concepts.TabOrderSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfTutorialSamples.Control_concepts"
mc:Ignorable="d"
Title="TabOrderSample" Height="250" Width="400">
    <Grid Margin="20">
<Grid.ColumnDefinitions>
    <ColumnDefinition Width="*" />
    <ColumnDefinition Width="20" />
    <ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
    <RowDefinition Height="*" />
    <RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<StackPanel>
    <Label>First name:</Label>
    <TextBox TabIndex="0" />
    <Label>Street name:</Label>
    <TextBox TabIndex="2" />
    <Label>City:</Label>
    <TextBox TabIndex="5" IsReadOnly="True" IsTabStop="False" Background="Gainsboro" />
</StackPanel>
<StackPanel Grid.Column="2">
    <Label>Last name:</Label>
    <TextBox TabIndex="1" />
    <Label>Zip Code:</Label>
    <TextBox TabIndex="4" />
</StackPanel>
<Button Grid.Row="1" HorizontalAlignment="Right" Width="80">Add</Button>
<Button Grid.Row="1" Grid.Column="2" HorizontalAlignment="Left" Width="80">Cancel</Button>
    </Grid>
</Window>

TabIndex プロパティで関連するコントロールに番号を振っていることに注意して下さい。そして IsTabStop をCityのテキストボックスに使っています。ダイアログでタブオーダーを制御するのは簡単です!

まとめ

ダイアログでタブオーダーを制御するのは非常に重要です。しかし幸運にも、WPFは自動で適切なタブオーダーの設定を行ってくれます。しかし、ある場合には、上の例で説明したように TabIndexIsTabStop プロパティを使ってコントロールすることは理にかなっています。


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!