VB のたまご

作成日: 2017/04/06, 更新日: 2017/04/06



タブインデックス

  •  ここでは、フォーカス遷移の順番を決める、タブインデックス制御を学習します。 ソースを見た方が早いので、以下サンプルです。.NET 標準のアプリケーションで作成してします。

  • <Window x:Class="Window1"
            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:w03_TabIndexes"
            mc:Ignorable="d"
            Title="Window1" Height="350" Width="525">
    
        <!-- FocusManager.FocusedElement にコントロール名を指定することで、初期フォーカスを当てることができる -->
        <StackPanel Margin="10" FocusManager.FocusedElement="{Binding ElementName=textbox2}">
    
            <TextBlock 
                TextWrapping="WrapWithOverflow"
                Text="WPF ではコントロールを書いた順番に、タブインデックスが割り当てられる。最初に配置した TextBox は、遷移済み扱い" 
                Margin="0,0,0,20" />
    
            <TextBox Text="1" />
            <TextBox Name="textbox2" Text="2" />
            <TextBox Text="3" />
            <TextBox Text="4" />
            <TextBox Text="5" />
    
        </StackPanel>
    
    </Window>
    

  •  WPF では(タブインデックスを明示的に指定しないと)コントロールの記載順にタブインデックスが割り当てられていきます。 続いては、明示的にタブインデックスを指定してみます。

  • <Window x:Class="Window2"
            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:w03_TabIndexes"
            mc:Ignorable="d"
            Title="Window2" Height="350" Width="525">
    
        <StackPanel Margin="10" FocusManager.FocusedElement="{Binding ElementName=textbox1}">
    
            <!-- WPF には WinForms にあったタブオーダー一括設定機能は無い -->
            <TextBlock 
                TextWrapping="WrapWithOverflow"
                Text="TabIndex の割り当てサンプル。インデックス値が同じ場合はコントロールの記載順。先に明示的にタブインデックスを記載しているコントロールを遷移。最後に未記載のコントロールに遷移。" 
                Margin="0,0,0,20" />
    
            <TextBox Name="textbox1" Text="a" TabIndex="1" />
            <TextBox Text="b" TabIndex="3" />
            <TextBox Text="c" TabIndex="2" />
            <TextBox Text="d" TabIndex="3" />
            <TextBox Text="e" TabIndex="4" />
            <TextBox Text="f" />
            <TextBox Text="g" />
            <TextBox Text="h" TabIndex="6" />
    
        </StackPanel>
    
    </Window>
    

  •  タブインデックスを割り当てたコントロールと割り当てていないコントロールがある場合、タブインデックスを割り当てたコントロールを全て廻った後で、 タブインデックスを割り当てていないコントロールに遷移していきます。タブインデックスが重複している場合、コントロールの記載順になります。

  •  WPF では、タブインデックスを一括で設定できる機能はありません。 タブインデックスを明示的に設定すると後で修正するのが手間なので、タブインデックスは記載せずにコントロール順に並べておき、 修正する必要がでたらコントロールを並び替えるのが楽なのではないかと思います。