none
textBoxを並べて上下のキーで移動したい RRS feed

  • 質問

  • お世話になります。

    ネットを読み漁っていたらEnterキーを押すことでコントロールを移動できるようなネタがありました。

    これを利用して、上下のキーで移動しようと考えましたが、上下のキーでは、ハンドラが呼ばれません。

    Enterキーでは呼ばれます。

    これって、仕方がないのでしょうか?

    コードは以下です。

    ビハインド

    private void EnterThenNextFocus(object sender, KeyEventArgs e) { UIElement u = (UIElement)sender; if (e.Key == Key.Down) u.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); if (e.Key == Key.Up) u.MoveFocus(new TraversalRequest(FocusNavigationDirection.Previous)); } xaml <Window.Resources> <Style TargetType="TextBox"> <EventSetter Event="KeyDown" Handler="EnterThenNextFocus"/> </Style> </Window.Resources>

    元ページはここです。

    http://ooltcloud.expressweb.jp/201311/article_26001848.html

    よろしくお願いします。

    Windows8/8.1 VS2015 comunity C# wpf 


    • 編集済み ferret001 2015年10月22日 4:36
    2015年10月22日 4:35

回答

  • そうですね。スタイルは上書きされます。
    今回の例では自動適用されるスタイルを個別のTextBoxで指定したスタイルがBasedOnで継承すれば良いので、以下のようにすると良いです。

    <TextBox.Style>
        <Style TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}" >
            <Style.Triggers>
           …
            </Style.Triggers>
        </Style>
    </TextBox.Style>
    • 回答としてマーク ferret001 2015年10月23日 0:47
    2015年10月22日 7:32
    モデレータ

すべての返信

  • こんにちは。

    その方法が適しているのかは検討してませんが、
    全てのキーを補足したいのであればPreviewKeyDownを対象にしたほうが良いと思います。

    <Window.Resources>
        <Style TargetType="TextBox">
            <!--<EventSetter Event="KeyDown" Handler="EnterThenNextFocus"/>-->
            <EventSetter Event="PreviewKeyDown" Handler="EnterThenNextFocus"/>
        </Style>
        <Style TargetType="ComboBox">
            <!--<EventSetter Event="KeyDown" Handler="EnterThenNextFocus"/>-->
            <EventSetter Event="PreviewKeyDown" Handler="EnterThenNextFocus"/>
        </Style>
    </Window.Resources>

    ※コードビハインド側の変更なし。

    <追記>
    ちなみに、例えば上下キーであれば複数行テキストボックスで下キー、コンボボックスの要素選択中に下キーなど、既定の動作に影響が発生する可能性もあります。
    どうしたいのかは別途検討されたほうが良いと思います。

    2015年10月22日 4:50
    モデレータ
  • 日本語ならではの問題として、IMEによる漢字変換候補の選択の際にも上下キーを押すかと思いますが、大丈夫なのでしょうか?
    2015年10月22日 5:06
  • お世話になります。

    PreviewKeyDownに変更すると上下のキーでも反応するようになりましたが、textBoxが多くいくつかをGroupBoxで囲んでいますが、1つ目のGroupBoxを出るとそれ以降は、キーを押しても反応しません。

    KeyDownに戻してKey.Enterにしても同様でした。GroupBoxを使うと不具合などあるんですかね。

    とっても便利な機能だと思ったのですが・・・

     > IMEによる漢字変換候補の選択の際にも上下キーを押すかと思いますが

    変換中は、その中(リスト内)だけの移動の用でしたのでOKだと思います。

    2015年10月22日 6:26
  • KeyDownに戻してKey.Enterにしても同様でした。GroupBoxを使うと不具合などあるんですかね。

    そんなことないと思いますけど…、試しに以下のようにした場合は動作しました。
    単純にGroupBox内にしかStyleが効いてないとかっていう問題ではないですよね?

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <Style TargetType="TextBox">
                <!--<EventSetter Event="KeyDown" Handler="EnterThenNextFocus"/>-->
                <EventSetter Event="PreviewKeyDown" Handler="EnterThenNextFocus"/>
            </Style>
            <Style TargetType="ComboBox">
                <!--<EventSetter Event="KeyDown" Handler="EnterThenNextFocus"/>-->
                <EventSetter Event="PreviewKeyDown" Handler="EnterThenNextFocus"/>
            </Style>
        </Window.Resources>
    
        <StackPanel Orientation="Horizontal">
            <GroupBox>
                <StackPanel>
                    <TextBox TabIndex="1"/>
                    <TextBox TabIndex="4"/>
                    <ComboBox TabIndex="2" />
                    <TextBox TabIndex="3"/>
                </StackPanel>
            </GroupBox>
            <GroupBox>
                <StackPanel>
                    <TextBox TabIndex="1"/>
                    <TextBox TabIndex="4"/>
                    <ComboBox TabIndex="2" />
                    <TextBox TabIndex="3"/>
                </StackPanel>
            </GroupBox>
        </StackPanel>
    </Window>
    
    UIのXAML部分を載せてください。

    2015年10月22日 6:39
    モデレータ
  • お世話になります。

    1つのGroupBoxを載せました。ほぼ同じものが全部で6つあります。

                 <StackPanel Grid.Row="0" Grid.Column="0" Name="stack1">
                        <GroupBox Margin="10,0,0,0">
                            <GroupBox.Header>
                                <TextBlock Text="項目情報" FontSize="20" />
                            </GroupBox.Header>
    
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="36" />
                                    <RowDefinition Height="36" />
                                    <RowDefinition Height="36" />
                                    <RowDefinition Height="36" />
                                    <RowDefinition Height="36" />
                                    <RowDefinition Height="36" />
                                </Grid.RowDefinitions>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="170" />
                                    <ColumnDefinition Width="170" />
                                </Grid.ColumnDefinitions>
    
                                <TextBlock Grid.Row="0" Grid.Column="0" Text="項目ID(6)" FontSize="17" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="10" />
                                <StackPanel Orientation="Horizontal" Grid.Row="0" Grid.Column="1">
                                    <Canvas Name="canvas1" />
                                    <TextBox Grid.Row="0" Grid.Column="1" x:Name="text1" Width="80" Height="23" FontSize="15" HorizontalAlignment="Left" Margin="21,0,0,0" KeyDown="text1_KeyDown" 
                                 VerticalAlignment="Center" MaxLength="6" local:PlaceHolderBehavior.PlaceHolderText="1文字+ボタン" local:NumericOnlyBehaviors.IsNumeric="True" InputMethod.PreferredImeState="Off">
                                        <TextBox.Style>
                                            <Style TargetType="TextBox">
                                                <Style.Triggers>
                                                    <DataTrigger Binding="{Binding  IsOK, Mode=TwoWay}" Value="True">
                                                        <Setter Property="Foreground" Value="Red" />
                                                        <Setter Property="ToolTip" Value="数字以外の文字が含まれています。" />
                                                    </DataTrigger>
                                                </Style.Triggers>
                                            </Style>
                                        </TextBox.Style>
                                        <TextBox.Text>
                                            <Binding Path="KomokuCD"  Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
                                                <Binding.ValidationRules>
                                                    <local:AngleRangeRule>
                                                        <local:AngleRangeRule.MinValue>
                                                            <local:DependencyInt Value="{Binding MinInputValue}" />
                                                        </local:AngleRangeRule.MinValue>
                                                        <local:AngleRangeRule.MaxValue>
                                                            <local:DependencyInt Value="{Binding MaxInputValue}" />
                                                        </local:AngleRangeRule.MaxValue>
                                                    </local:AngleRangeRule>
                                                </Binding.ValidationRules>
                                            </Binding>
                                        </TextBox.Text>
                                    </TextBox>
                                    <Button Content="空番号" Grid.Row="0" Grid.Column="1" Name="button1" Width="50" Margin="3,7" FontSize="15" Click="button1_Click" >
                                        <ToolTipService.ToolTip>
                                            <ToolTip Content="項目分類(項目ID)の最初の1文字を入力してボタンを押してください。" FontSize="18" Background="LightYellow" Foreground="Red"/>
                                        </ToolTipService.ToolTip>
                                    </Button>
                                </StackPanel>
    
    
                                <TextBlock Grid.Row="1" Grid.Column="0" Text="分類グループ(10)" FontSize="17" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="10" />
                                <!-- <TextBox Grid.Row="1" Grid.Column="1" Name="text2" Width="130" FontSize="17" HorizontalAlignment="Center" VerticalAlignment="Center" MaxLength="10" InputMethod.PreferredImeState="Off" /> -->
                                <WindowsFormsHost x:Name="wfHost" Grid.Column="1" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center" Width="130" FontSize="17" >
                                    <wf:MaskedTextBox x:Name="text2" Mask="0-00-00-0" Width="130" MaxLength="10"  />
                                </WindowsFormsHost>
    
                                <TextBlock Grid.Row="2" Grid.Column="0" Text="並び順(3)" FontSize="17" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="10" />
                                <TextBox Grid.Row="2" Grid.Column="1" Name="text3" Width="130" FontSize="17" HorizontalAlignment="Center" VerticalAlignment="Center" MaxLength="3" InputMethod.PreferredImeState="Off" local:NumericOnlyBehaviors.IsNumeric="True">
                                    <TextBox.Style>
                                        <Style TargetType="TextBox">
                                            <Style.Triggers>
                                                <DataTrigger Binding="{Binding  IsOK, Mode=TwoWay}" Value="True">
                                                    <Setter Property="Foreground" Value="Red" />
                                                    <Setter Property="ToolTip" Value="数字以外の文字が含まれています。" />
                                                </DataTrigger>
                                            </Style.Triggers>
                                        </Style>
                                    </TextBox.Style>
                                    <TextBox.Text>
                                        <Binding Path="Sequence"  Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
                                            <Binding.ValidationRules>
                                                <local:AngleRangeRule />
                                            </Binding.ValidationRules>
                                        </Binding>
                                    </TextBox.Text>
                                </TextBox>
    
                                <TextBlock Grid.Row="3" Grid.Column="0" Text="統一コード(17)" FontSize="17" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="10" />
                                <TextBox Grid.Row="3" Grid.Column="1" Name="text4" Width="130" FontSize="17" HorizontalAlignment="Center" VerticalAlignment="Bottom" MaxLength="6" InputMethod.PreferredImeState="Off" Margin="19.6,0,20,6"/>
    
                                <TextBlock Grid.Row="4" Grid.Column="0" Text="項目表示名(40)" FontSize="17" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="10" />
                                <TextBox Grid.Row="4" Grid.Column="1" Name="text5" Width="130" FontSize="17" HorizontalAlignment="Center" VerticalAlignment="Center" MaxLength="40" InputMethod.PreferredImeState="On" TextChanged="text5_TextChanged"/>
    
                                <TextBlock Grid.Row="5" Grid.Column="0" Text="項目印刷名(40)" FontSize="17" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="10" />
                                <TextBox Grid.Row="5" Grid.Column="1" Name="text6" Width="130" FontSize="17" HorizontalAlignment="Center" VerticalAlignment="Center" MaxLength="40" InputMethod.PreferredImeState="On" TextChanged="text6_TextChanged"/>
                            </Grid>
                        </GroupBox>
                    </StackPanel>

    このTexoBox.Styleを充てている部分が反応していないようです。他のGroupBoxも同様でした。

    単に<TextBox ・・・/>は、動作していました。スタイルどうしがうまく絡んでないみたいですね。

    どっちがゆうせんとか、あるのでしょうか?

    2015年10月22日 7:03
  • そうですね。スタイルは上書きされます。
    今回の例では自動適用されるスタイルを個別のTextBoxで指定したスタイルがBasedOnで継承すれば良いので、以下のようにすると良いです。

    <TextBox.Style>
        <Style TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}" >
            <Style.Triggers>
           …
            </Style.Triggers>
        </Style>
    </TextBox.Style>
    • 回答としてマーク ferret001 2015年10月23日 0:47
    2015年10月22日 7:32
    モデレータ
  • Tak1wa様、お世話になります。

    ご指摘の BaseOn・・・でうまくいくようになりました。

    移動先をいちいち指定しなくても

    FocusNavigationDirection.Next

    で移動って簡単で便利ですね。

    ありがとうございました。

    2015年10月23日 0:47