回答編集履歴

2

見直しキャンペーン中

2023/07/23 09:35

投稿

TN8001
TN8001

スコア9884

test CHANGED
@@ -1,159 +1,80 @@
1
1
  [C# - 【WPF】IsEditableなコンボボックスでのアイテム選択時にテキストの全選択を行わせない|teratail](https://teratail.com/questions/90170)
2
-
3
2
  ↑で0,0にすれば先頭には来ますが、`IsTextSearchEnabled=true`(デフォルト)だと挙動が非常に気持ち悪いです。
4
3
 
5
-
6
-
7
4
  `DropDownClosed`でやると気持ち悪さはないですが、一瞬選択が見えてしまいます。
8
-
9
5
  もうちょっといい方法もありそうですが。。。
10
-
11
-
12
6
 
13
7
  ---
14
8
 
15
-
16
-
17
9
  追記 「気持ち悪さ」について説明不足に感じたので検証コード
18
10
 
19
-
20
-
21
11
  文章で説明しずらいので、実行してもらったほうが早いです。
22
-
23
12
  各コンボボックスで、空の状態で`a`を数文字打つとどういうことかわかります。
24
13
 
25
-
26
-
27
- ```xaml
14
+ ```xml
28
-
29
15
  <Window
30
-
31
16
  x:Class="Questions303065.MainWindow"
32
-
33
17
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
34
-
35
18
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
36
-
37
19
  Width="800"
38
-
39
20
  Height="450">
40
-
41
21
  <StackPanel>
42
-
43
22
  <GroupBox Header="IsTextSearchEnabled=True">
44
-
45
23
  <ComboBox IsEditable="True" SelectionChanged="ComboBox_SelectionChanged">
46
-
47
24
  <ComboBoxItem>aa</ComboBoxItem>
48
-
49
25
  <ComboBoxItem>aaaa</ComboBoxItem>
50
-
51
26
  <ComboBoxItem>bb</ComboBoxItem>
52
-
53
27
  </ComboBox>
54
-
55
28
  </GroupBox>
56
-
57
29
  <GroupBox Header="IsTextSearchEnabled=False">
58
-
59
30
  <ComboBox
60
-
61
31
  IsEditable="True"
62
-
63
32
  IsTextSearchEnabled="False"
64
-
65
33
  SelectionChanged="ComboBox_SelectionChanged">
66
-
67
34
  <ComboBoxItem>aa</ComboBoxItem>
68
-
69
35
  <ComboBoxItem>aaaa</ComboBoxItem>
70
-
71
36
  <ComboBoxItem>bb</ComboBoxItem>
72
-
73
37
  </ComboBox>
74
-
75
38
  </GroupBox>
76
-
77
39
  <GroupBox Header="DropDownClosed">
78
-
79
40
  <ComboBox DropDownClosed="ComboBox_DropDownClosed" IsEditable="True">
80
-
81
41
  <ComboBoxItem>aa</ComboBoxItem>
82
-
83
42
  <ComboBoxItem>aaaa</ComboBoxItem>
84
-
85
43
  <ComboBoxItem>bb</ComboBoxItem>
86
-
87
44
  </ComboBox>
88
-
89
45
  </GroupBox>
90
-
91
46
  </StackPanel>
92
-
93
47
  </Window>
94
-
95
48
  ```
96
49
 
97
-
98
-
99
- ```C#
50
+ ```cs
100
-
101
51
  using System;
102
-
103
52
  using System.Windows;
104
-
105
53
  using System.Windows.Controls;
106
54
 
107
-
108
-
109
55
  namespace Questions303065
110
-
111
56
  {
112
-
113
57
  public partial class MainWindow : Window
114
-
115
58
  {
116
-
117
59
  public MainWindow() => InitializeComponent();
118
60
 
119
-
120
-
121
61
  private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
122
-
123
62
  {
124
-
125
63
  var comboBox = (ComboBox)sender;
126
-
127
64
  if(comboBox.Template?.FindName("PART_EditableTextBox", comboBox) is TextBox textBox)
128
-
129
65
  {
130
-
131
66
  Dispatcher.InvokeAsync(() => textBox.Select(0, 0));
132
-
133
67
  }
134
-
135
68
  }
136
69
 
137
-
138
-
139
70
  private void ComboBox_DropDownClosed(object sender, EventArgs e)
140
-
141
71
  {
142
-
143
72
  var comboBox = (ComboBox)sender;
144
-
145
73
  if(comboBox.Template?.FindName("PART_EditableTextBox", comboBox) is TextBox textBox)
146
-
147
74
  {
148
-
149
75
  Dispatcher.InvokeAsync(() => textBox.Select(0, 0));
150
-
151
76
  }
152
-
153
77
  }
154
-
155
78
  }
156
-
157
79
  }
158
-
159
80
  ```

1

追記 「気持ち悪さ」について説明

2020/11/09 13:50

投稿

TN8001
TN8001

スコア9884

test CHANGED
@@ -7,3 +7,153 @@
7
7
  `DropDownClosed`でやると気持ち悪さはないですが、一瞬選択が見えてしまいます。
8
8
 
9
9
  もうちょっといい方法もありそうですが。。。
10
+
11
+
12
+
13
+ ---
14
+
15
+
16
+
17
+ 追記 「気持ち悪さ」について説明不足に感じたので検証コード
18
+
19
+
20
+
21
+ 文章で説明しずらいので、実行してもらったほうが早いです。
22
+
23
+ 各コンボボックスで、空の状態で`a`を数文字打つとどういうことかわかります。
24
+
25
+
26
+
27
+ ```xaml
28
+
29
+ <Window
30
+
31
+ x:Class="Questions303065.MainWindow"
32
+
33
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
34
+
35
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
36
+
37
+ Width="800"
38
+
39
+ Height="450">
40
+
41
+ <StackPanel>
42
+
43
+ <GroupBox Header="IsTextSearchEnabled=True">
44
+
45
+ <ComboBox IsEditable="True" SelectionChanged="ComboBox_SelectionChanged">
46
+
47
+ <ComboBoxItem>aa</ComboBoxItem>
48
+
49
+ <ComboBoxItem>aaaa</ComboBoxItem>
50
+
51
+ <ComboBoxItem>bb</ComboBoxItem>
52
+
53
+ </ComboBox>
54
+
55
+ </GroupBox>
56
+
57
+ <GroupBox Header="IsTextSearchEnabled=False">
58
+
59
+ <ComboBox
60
+
61
+ IsEditable="True"
62
+
63
+ IsTextSearchEnabled="False"
64
+
65
+ SelectionChanged="ComboBox_SelectionChanged">
66
+
67
+ <ComboBoxItem>aa</ComboBoxItem>
68
+
69
+ <ComboBoxItem>aaaa</ComboBoxItem>
70
+
71
+ <ComboBoxItem>bb</ComboBoxItem>
72
+
73
+ </ComboBox>
74
+
75
+ </GroupBox>
76
+
77
+ <GroupBox Header="DropDownClosed">
78
+
79
+ <ComboBox DropDownClosed="ComboBox_DropDownClosed" IsEditable="True">
80
+
81
+ <ComboBoxItem>aa</ComboBoxItem>
82
+
83
+ <ComboBoxItem>aaaa</ComboBoxItem>
84
+
85
+ <ComboBoxItem>bb</ComboBoxItem>
86
+
87
+ </ComboBox>
88
+
89
+ </GroupBox>
90
+
91
+ </StackPanel>
92
+
93
+ </Window>
94
+
95
+ ```
96
+
97
+
98
+
99
+ ```C#
100
+
101
+ using System;
102
+
103
+ using System.Windows;
104
+
105
+ using System.Windows.Controls;
106
+
107
+
108
+
109
+ namespace Questions303065
110
+
111
+ {
112
+
113
+ public partial class MainWindow : Window
114
+
115
+ {
116
+
117
+ public MainWindow() => InitializeComponent();
118
+
119
+
120
+
121
+ private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
122
+
123
+ {
124
+
125
+ var comboBox = (ComboBox)sender;
126
+
127
+ if(comboBox.Template?.FindName("PART_EditableTextBox", comboBox) is TextBox textBox)
128
+
129
+ {
130
+
131
+ Dispatcher.InvokeAsync(() => textBox.Select(0, 0));
132
+
133
+ }
134
+
135
+ }
136
+
137
+
138
+
139
+ private void ComboBox_DropDownClosed(object sender, EventArgs e)
140
+
141
+ {
142
+
143
+ var comboBox = (ComboBox)sender;
144
+
145
+ if(comboBox.Template?.FindName("PART_EditableTextBox", comboBox) is TextBox textBox)
146
+
147
+ {
148
+
149
+ Dispatcher.InvokeAsync(() => textBox.Select(0, 0));
150
+
151
+ }
152
+
153
+ }
154
+
155
+ }
156
+
157
+ }
158
+
159
+ ```