質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

1088閲覧

DataGridのキーボード操作を変更したい

nokinoki

総合スコア13

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2018/04/12 05:43

編集2018/04/13 08:31

前提・実現したいこと

DataGridのキーボード操作に関する質問です。

現状、tabキーによる行の移動は廃止しています。
ただ行内のセル移動はtabキーでも移動可で、名前のセルまで移動し、
更にtabキーをクリックするとButtonにフォーカスが当たるようになっています。

実現したいことは以下となります。

Buttonからtabキーによって再度DataGridに戻ってきた時に、
1行目のIDセルではなく、すでに選択済みの行に直接フォーカスが戻ってくるようにしたいです。

現状の画像では、3行目が選択されている状態で一旦tabキーでDataGridを離れ、
再度戻ってきた状態の画像で、1行目のIDセルにフォーカスが当たっているのが分かります。
これを直接3行目にフォーカスが当たっているようにしたいのです。

もしくは、
再度DataGridに戻ってきた時に、1行目でも構わないのですが、
IDのセルのみにフォーカスが当たるのではなく、
1行全体にフォーカスが当たる(背景色が変わるなど)ようにするにはどうすれば良いのでしょうか?

以上よろしくお願いいたします。

現状

イメージ説明

該当のソースコード

<Grid> <DataGrid Name="dataGrid01" AutoGenerateColumns="False" KeyboardNavigation.TabNavigation="Once" Margin="0,37,0,76"> <!--各行スタイル--> <DataGrid.RowStyle> <Style TargetType="DataGridRow"> <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="Background" Value="Green" /> <Setter Property="Foreground" Value="Black" /> </Trigger> </Style.Triggers> </Style> </DataGrid.RowStyle> <!--各セルスタイル--> <DataGrid.CellStyle> <Style TargetType="DataGridCell"> <Style.Triggers> <Trigger Property="IsSelected" Value="True"> <Setter Property="Background" Value="Orange" /> <Setter Property="Foreground" Value="Black" /> </Trigger> </Style.Triggers> </Style> </DataGrid.CellStyle> <DataGrid.Columns> <DataGridTextColumn Header="ID" Binding="{Binding Id}"></DataGridTextColumn> <DataGridTextColumn Header="名前" Width="*" Binding="{Binding Name}"></DataGridTextColumn> </DataGrid.Columns> </DataGrid> <Button Content="Button" HorizontalAlignment="Left" Margin="417,270,0,0" VerticalAlignment="Top" Width="75" /> </Grid>

補足情報(データ側のコード)

public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); List<Book> books = new List<Book>(); books.Add(new Book() { Id = 1, Name = "太郎" }); books.Add(new Book() { Id = 2, Name = "花子" }); books.Add(new Book() { Id = 3, Name = "次郎" }); dataGrid01.ItemsSource = books; } public class Book { public int Id { get; set; } public string Name { get; set; } } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

DataGrid のいわゆるセルの選択状態には二種類あります。
一つはフォーカスが当たっている状態で、これをカレントセルと呼びます。
もう一つはユーザーによって選択マークを付けられた状態で、これを選択セルと呼びます。

この質問の場合は、タブによってカレントセルが移動し、それに伴ってカレントセルが選択されて選択セルになっている状態です。
カレントセルが移動するとセルの選択も一緒に移動するので一見同じもののように見えますが、これらは違うものです。

さらにタブを押して DataGrid からフォーカスが外れてボタンにフォーカスが移った場合、カレントセルは無くなります。
これは DataGrid のカレントセルにデータバインディングした時に必要な挙動です。
この場合、カレントセルは無くなりますが、選択セルは選択されたまま残ります。

ボタンからフォーカスが戻ってきたとき、カレントセルは null なので新しく最初のセルがカレントセルになります。
しかし選択セルは前回のまま残り、カレントセルが次に移動したときにカレントセルが選択されます。

つまり、フォーカスが DataGrid に戻ってきた時にはまだ元のセルが選択されているので、カレントをそこに移動させればいいわけです。
具体的には GotFocus イベントをハンドルしてカレントセルが選択されていなければ選択セルの位置を入手し(dataGrid01.Items.IndexOf(dataGrid01.SelectedCells[0]))、そこをカレントにしてください。

[WPF] DATAGRID の CURRENTCELL をコードから設定する。

投稿2018/04/13 13:34

編集2018/04/13 13:35
Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nokinoki

2018/04/18 00:16

丁寧な回答ありがとうございます。考え方が分かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問