1

私の WPF 4.0 デスクトップ ベースのアプリケーションでは、タブ ボタンを押してウィンドウ要素をトラバースする機能を追加したいと考えています。

これが私の XAML のフラグメントです。

<!--main body layout-->
<StackPanel x:Name="BodyLayout"
        Style="{StaticResource Body_Block}">

    <!--teaser block-->
    <Grid x:Name="TeaserGrid">
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition />
        </Grid.RowDefinitions>

        <TextBlock Grid.Column="0"
               Grid.Row="0"
               Style="{StaticResource Body_Teaser_Centering}">
                <Hyperlink Style="{StaticResource Body_Teaser_Hyperlink}"
                       Focusable="True"
                       KeyboardNavigation.TabIndex="0"
                       Click="Call_WinOffences_Click">
                    <Image Source="Resources/teaser_offences.png"
                           Style="{StaticResource Body_Teaser_Image}" />
                    <LineBreak />
                    <TextBlock Text="Offences"
                            Style="{StaticResource Body_Title}" />
                </Hyperlink>
        </TextBlock>

        <TextBlock Grid.Column="1"
               Grid.Row="0"
               Style="{StaticResource Body_Teaser_Centering}">
            <Hyperlink Style="{StaticResource Body_Teaser_Hyperlink}"
                   Focusable="True"
                   KeyboardNavigation.TabIndex="1"
                   Click="Call_WinEvents_Click">
                <Image Source="Resources/teaser_events.png"
                       Style="{StaticResource Body_Teaser_Image}" />
                <LineBreak />
                <TextBlock Text="Events"
                       Style="{StaticResource Body_Title}" />
            </Hyperlink>
        </TextBlock>
    </Grid>
</StackPanel>

正確に何が必要ですか?このウィンドウを開き、最初に Tab キーボードを押してハイパーリンク ブロック (ImageTextBlock) にフォーカスを設定TabIndex="0"し、2 番目の Tab を押して要素にフォーカスを切り替えるとTabIndex="1"、このスイッチを循環させたいと考えています。言い換えれば、他の通常の WinForms アプリケーションでは通常これを行うため、ユーザーが Tab キーボードでウィンドウ内の要素をナビゲートできるようにしたいと考えています。

実際に私は今何を持っていますか? Tab キーボードを押すと、ハイパーリンクがフォーカスされず、マウスがないとウィンドウで作業できません。

教えてください、何が間違っているのですか?

4

2 に答える 2

1

更新
あなたのサンプル コード (私が持っていなかったスタイルを除く) を小さなプロジェクトにコピーしましたが、問題なく動作しているようです。ウィンドウを起動し、Tab を押して最初のハイパーリンクにフォーカスし、Enter を押すと Click イベントが発生し、Tab をもう一度押すなどです。スタイルの何かがこの動作をオーバーライドしているとしか思えません。サンプル プロジェクトをここにアップロードしました。

注:画像のソースを変更したので、元に戻す必要があります:)

古い投稿
ここには 2 つの部分があります。1 つ目は、FrameworkElement が Focusable かどうかです。2 つ目は TabIndex です。TabIndex は FrameworkElement から派生した Control にあり、TextBlock、Rectangle などのすべての要素が Control から派生しているわけではありません。何らかの理由でそのような要素に TabIndex を追加したい場合は、代わりに KeyboardNavigation.TabIndex を使用できます。これは、タブ オーダーが設定された 6 つのコントロールの簡単な例です。1 つの Rectangle はフォーカス可能ではありません (既定ではフォーカス可能ではないため)。

<Grid ShowGridLines="True">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <Button Grid.Row="0" Grid.Column="0"
            Content="Some Button"
            KeyboardNavigation.TabIndex="0"
            Margin="5"/>
    <TextBox Grid.Row="1" Grid.Column="0"
             Text="Some TextBox"
             KeyboardNavigation.TabIndex="2"
             Margin="5"/>
    <TextBox Grid.Row="2" Grid.Column="0"
             Text="Another TextBox"
             KeyboardNavigation.TabIndex="1"
             Margin="5"/>
    <TextBlock Grid.Row="0" Grid.Column="1"
               Text="Focusable TextBlock"
               Focusable="True"
               KeyboardNavigation.TabIndex="4"
               Margin="5"/>
    <Rectangle Grid.Row="1" Grid.Column="1"
               Fill="Blue"
               Margin="5"/>
    <Rectangle Grid.Row="2" Grid.Column="1"
               Fill="Red"
               Focusable="True"
               KeyboardNavigation.TabIndex="3"
               Margin="5"/>
</Grid>
于 2010-12-05T21:51:46.180 に答える
0

たぶんこれが役に立ちます: ItemsControl の WPF TabStop / TabIndex

TabIndex は、ここに行く方法です。タブを押してコントロールを移動すると、TabIndex の順序で移動します。これらは連続した順序である必要さえありません。3 と 4 がどこにも定義されていない場合、1、2、5 は 1、2、3 と同じです。

于 2010-12-05T21:39:30.377 に答える