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

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

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

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

WPF

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

Q&A

解決済

2回答

2906閲覧

WPF でComboBoxのカーソル位置を設定したい

Yamamin

総合スコア18

C#

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

WPF

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

1グッド

0クリップ

投稿2020/11/08 12:54

編集2020/11/08 14:15

WPF のComboBoxで「IsEditable」を「True」にして編集可能にしたのですが、
項目を変更した時に、カーソルの位置が一番後ろに来てしまいます。
項目を変更した時に、カーソルの位置を先頭に持ってくるにはどのようにしたらいいでしょうか?
TextBoxのSelect(0, 0);をComboBoxにおいても行いたいです。

TN8001👍を押しています

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

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

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

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

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

TN8001

2020/11/08 14:09

>XPF WPFでいいんですよね?(タイトル・本文とも編集できます) カーソルの位置以前に、全選択状態になりませんか? 全選択を解除したうえでカーソルを先頭に、という意味でSelect(0, 0)ってことですかね?
Yamamin

2020/11/08 14:14

投稿ありがとうございます。すみません、wpfの間違いです。 全選択を解除したうえでカーソルを先頭に、という意味でSelect(0, 0)ってことですかね? その通りです。
guest

回答2

0

ComboBoxのLoadedイベントでTemplateメンバから名前PART_EditableTextBoxのテキストボックスを引っ張ってきてSelectionChangedイベントをハンドリングしてあげればできそうです。

MainWindow.xaml

xaml

1<Window 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:WpfApp5" 7 xmlns:Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero2" x:Class="WpfApp5.MainWindow" 8 mc:Ignorable="d" 9 Title="MainWindow" Height="450" Width="800"> 10 <Grid> 11 <ComboBox IsEditable="True" SelectedIndex="1" Loaded="ComboBox_Loaded"> 12 <ComboBoxItem>AA</ComboBoxItem> 13 <ComboBoxItem>BB</ComboBoxItem> 14 <ComboBoxItem>CC</ComboBoxItem> 15 </ComboBox> 16 </Grid> 17</Window>

MainWindow.xaml.cs

C#

1namespace WpfApp5 2{ 3 /// <summary> 4 /// MainWindow.xaml の相互作用ロジック 5 /// </summary> 6 public partial class MainWindow : Window 7 { 8 public MainWindow() 9 { 10 InitializeComponent(); 11 } 12 13 private void ComboBox_Loaded(object sender, RoutedEventArgs e) 14 { 15 if (sender is ComboBox combo 16 && combo.Template.FindName("PART_EditableTextBox", combo) is TextBox textbox 17 && textbox != null) 18 { 19 SelectionChangedEventHandler combo_selectionchanged = null; 20 RoutedEventHandler textbox_selectionchanged = null; 21 RoutedEventHandler combo_unloaded = null; 22 23 textbox_selectionchanged = (s2, e2) => 24 { 25 if (textbox.SelectionLength != 0) 26 { 27 textbox.SelectionChanged -= textbox_selectionchanged; 28 textbox.Select(0, 0); 29 } 30 }; 31 32 combo_selectionchanged = (s1, e1) => 33 { 34 if (combo.IsDropDownOpen) 35 textbox.SelectionChanged += textbox_selectionchanged; 36 }; 37 38 combo_unloaded = (s3, e3) => 39 { 40 combo.SelectionChanged -= combo_selectionchanged; 41 combo.Unloaded -= combo_unloaded; 42 }; 43 44 combo.SelectionChanged += combo_selectionchanged; 45 combo.Unloaded += combo_unloaded; 46 } 47 } 48 } 49}

投稿2020/11/11 03:35

編集2020/11/11 06:12
ikarimame

総合スコア37

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

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

ikarimame

2020/11/11 03:42

申し訳ありません、すでに回答がついておりました、よく確認しておりませんでした
Yamamin

2020/11/11 06:32 編集

ありがとうございました。こちらの方法でも試してみました。大変参考になりました。
guest

0

ベストアンサー

C# - 【WPF】IsEditableなコンボボックスでのアイテム選択時にテキストの全選択を行わせない|teratail
↑で0,0にすれば先頭には来ますが、IsTextSearchEnabled=true(デフォルト)だと挙動が非常に気持ち悪いです。

DropDownClosedでやると気持ち悪さはないですが、一瞬選択が見えてしまいます。
もうちょっといい方法もありそうですが。。。


追記 「気持ち悪さ」について説明不足に感じたので検証コード

文章で説明しずらいので、実行してもらったほうが早いです。
各コンボボックスで、空の状態でaを数文字打つとどういうことかわかります。

xml

1<Window 2 x:Class="Questions303065.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 Width="800" 6 Height="450"> 7 <StackPanel> 8 <GroupBox Header="IsTextSearchEnabled=True"> 9 <ComboBox IsEditable="True" SelectionChanged="ComboBox_SelectionChanged"> 10 <ComboBoxItem>aa</ComboBoxItem> 11 <ComboBoxItem>aaaa</ComboBoxItem> 12 <ComboBoxItem>bb</ComboBoxItem> 13 </ComboBox> 14 </GroupBox> 15 <GroupBox Header="IsTextSearchEnabled=False"> 16 <ComboBox 17 IsEditable="True" 18 IsTextSearchEnabled="False" 19 SelectionChanged="ComboBox_SelectionChanged"> 20 <ComboBoxItem>aa</ComboBoxItem> 21 <ComboBoxItem>aaaa</ComboBoxItem> 22 <ComboBoxItem>bb</ComboBoxItem> 23 </ComboBox> 24 </GroupBox> 25 <GroupBox Header="DropDownClosed"> 26 <ComboBox DropDownClosed="ComboBox_DropDownClosed" IsEditable="True"> 27 <ComboBoxItem>aa</ComboBoxItem> 28 <ComboBoxItem>aaaa</ComboBoxItem> 29 <ComboBoxItem>bb</ComboBoxItem> 30 </ComboBox> 31 </GroupBox> 32 </StackPanel> 33</Window>

cs

1using System; 2using System.Windows; 3using System.Windows.Controls; 4 5namespace Questions303065 6{ 7 public partial class MainWindow : Window 8 { 9 public MainWindow() => InitializeComponent(); 10 11 private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 12 { 13 var comboBox = (ComboBox)sender; 14 if(comboBox.Template?.FindName("PART_EditableTextBox", comboBox) is TextBox textBox) 15 { 16 Dispatcher.InvokeAsync(() => textBox.Select(0, 0)); 17 } 18 } 19 20 private void ComboBox_DropDownClosed(object sender, EventArgs e) 21 { 22 var comboBox = (ComboBox)sender; 23 if(comboBox.Template?.FindName("PART_EditableTextBox", comboBox) is TextBox textBox) 24 { 25 Dispatcher.InvokeAsync(() => textBox.Select(0, 0)); 26 } 27 } 28 } 29}

投稿2020/11/08 14:29

編集2023/07/23 09:35
TN8001

総合スコア9394

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

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

Yamamin

2020/11/09 12:54

返信遅くなりすみません。リンクに書いてある方法で行くことにしました。 ご回答ありがとうございました。助かりました。
Yamamin

2020/11/10 12:55

引き続きご丁寧にありがとうございます。ちょっと今、別件で忙しくなってまして、落ちついたら上記のソースコードで試して動きを検証して、コメントさせていただきたいと思います。 ありがとうございました。
Yamamin

2020/11/11 06:35

上記のコードをコンパイルして動かしてみました。おっしゃってる意味がわかりました。今回の仕様はnull値を候補に入れたいらしく、別の値を設定することはないので、上記コードで大丈夫そうです。大変参考になりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問