トップ回答者
textBoxを並べて上下のキーで移動したい

質問
-
お世話になります。
ネットを読み漁っていたら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
回答
-
そうですね。スタイルは上書きされます。
今回の例では自動適用されるスタイルを個別の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
すべての返信
-
こんにちは。
その方法が適しているのかは検討してませんが、
全てのキーを補足したいのであれば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>
※コードビハインド側の変更なし。
<追記>
ちなみに、例えば上下キーであれば複数行テキストボックスで下キー、コンボボックスの要素選択中に下キーなど、既定の動作に影響が発生する可能性もあります。
どうしたいのかは別途検討されたほうが良いと思います。- 編集済み いわさ Tak1waMVP, Moderator 2015年10月22日 4:59
-
-
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部分を載せてください。
-
お世話になります。
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 ・・・/>は、動作していました。スタイルどうしがうまく絡んでないみたいですね。
どっちがゆうせんとか、あるのでしょうか?
-
そうですね。スタイルは上書きされます。
今回の例では自動適用されるスタイルを個別の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