WPF のComboBoxで「IsEditable」を「True」にして編集可能にしたのですが、
項目を変更した時に、カーソルの位置が一番後ろに来てしまいます。
項目を変更した時に、カーソルの位置を先頭に持ってくるにはどのようにしたらいいでしょうか?
TextBoxのSelect(0, 0);をComboBoxにおいても行いたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/08 14:14
回答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総合スコア37
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総合スコア9884
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/09 12:54
2020/11/10 12:55
2020/11/11 06:35
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。