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

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

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

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

WPF

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

Q&A

解決済

1回答

2561閲覧

[C#]ElementHostを介したWPFコントロールでListViewのフォーカスが外れる

shi012

総合スコア1

C#

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

WPF

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

1グッド

0クリップ

投稿2021/06/29 02:23

前提・実現したいこと

C#でWindowsフォームアプリケーションを作成しています。
ElementHostコントロールを介して、WPFユーザーコントロールを配置しており、その中にはListViewコントロールを使用しています。

ListView内の項目選択を変更するためにキーボードの上/下/左/右キー操作した際、WPFユーザーコントロールからフォーカスが外れてしまい、WinFormsの別のコントールにフォーカスが移動してしまいます。
ListView内にフォーカスを留まらせる方法がもし分かるようでしたら教えてください。

該当のソースコード

WinFormsのForm1.Designer.cs

C#

1private void InitializeComponent() 2 { 3 this.textBox1 = new System.Windows.Forms.TextBox(); 4 this.elementHost1 = new System.Windows.Forms.Integration.ElementHost(); 5 this.userControl1 = new WindowsFormsApp2.UserControl1(); 6 this.SuspendLayout(); 7 // 8 // textBox1 9 // 10 this.textBox1.Location = new System.Drawing.Point(33, 23); 11 this.textBox1.Name = "textBox1"; 12 this.textBox1.Size = new System.Drawing.Size(100, 19); 13 this.textBox1.TabIndex = 3; 14 // 15 // elementHost1 16 // 17 this.elementHost1.Location = new System.Drawing.Point(33, 48); 18 this.elementHost1.Name = "elementHost1"; 19 this.elementHost1.Size = new System.Drawing.Size(717, 390); 20 this.elementHost1.TabIndex = 1; 21 this.elementHost1.Text = "elementHost2"; 22 this.elementHost1.Child = this.userControl1; 23 // 24 // Form1 25 // 26 this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); 27 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 28 this.ClientSize = new System.Drawing.Size(800, 450); 29 this.Controls.Add(this.textBox1); 30 this.Controls.Add(this.elementHost1); 31 this.Name = "Form1"; 32 this.Text = "Form1"; 33 this.ResumeLayout(false); 34 this.PerformLayout(); 35 36 } 37 38 #endregion 39 private System.Windows.Forms.Integration.ElementHost elementHost1; 40 private UserControl1 userControl1; 41 private System.Windows.Forms.TextBox textBox1;

WPFユーザーコントロールのXAML

C#

1<UserControl x:Class="WindowsFormsApp2.UserControl1" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 6 xmlns:local="clr-namespace:WindowsFormsApp2" 7 mc:Ignorable="d" Height="178.512" Width="426.86"> 8 <Grid> 9 <ListView x:Name="listView" HorizontalAlignment="Left" Height="136" Margin="20,26,0,0" VerticalAlignment="Top" Width="391"> 10 <ListView.View> 11 <GridView> 12 <GridViewColumn Header="ユーザ名" DisplayMemberBinding="{Binding Name}" Width="100"/> 13 <GridViewColumn Header="年齢" DisplayMemberBinding="{Binding Age}" Width="50"/> 14 <GridViewColumn Header="住所" DisplayMemberBinding="{Binding Path=Address}" Width="200"/> 15 </GridView> 16 </ListView.View> 17 </ListView> 18 </Grid> 19</UserControl>

WPFユーザーコントロールのコードビハインド

C#

1public partial class UserControl1 : UserControl 2 { 3 public UserControl1() 4 { 5 InitializeComponent(); 6 7 ObservableCollection<User> users = new ObservableCollection<User>(); 8 users.Add(new User() { Name = "Yamada", Age = 50, Address = "Tokyo" }); 9 users.Add(new User() { Name = "Suzuki", Age = 30, Address = "Nagoya" }); 10 users.Add(new User() { Name = "Sato", Age = 40, Address = "Osaka" }); 11 12 listView.ItemsSource = users; 13 } 14 }

試したこと

WindowsフォームアプリケーションではなくWPFアプリで、WPFユーザーコントロールを使用した場合、上記の問題は発生しませんでした。
キーボードの上/下/左/右キー操作した際、ListView内からフォーカスは外れません。

補足情報(FW/ツールのバージョンなど)

開発環境:Visual Studio 2017 Express
ターゲットフレームワーク:.NET Framework 4

TN8001👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

ElementHostコントロールを介して、WPFユーザーコントロールを配置しており、その中にはListViewコントロールを使用しています。

こういう構成をしている例は珍しいのか全く情報がないですね...

ListView内にフォーカスを留まらせる方法

とりあえずKeyDownを処理済みにしたら移らなくなりました。
しかしそれでいいのか、何か不具合があるかはわかりません。

xml

1<ListView KeyDown="listView_KeyDown">

cs

1private void listView_KeyDown(object sender, KeyEventArgs e) 2{ 3 if (e.Key != Key.Tab) e.Handled = true; 4}

投稿2021/06/29 15:30

編集2023/07/27 16:23
TN8001

総合スコア9246

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

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

shi012

2021/06/30 02:15

試してみた結果、意図した動作ができました。 今のところ、特に問題は見られません。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問