Я использую доступный для редактирования ComboBox в wpf, но когда я пытаюсь установить фокус из кода C#, это - только выставочный выбор. но я хочу пойти для опции редактирования (курсор должен отобразиться для ввода данных пользователем).
Вы можете попробовать наследовать от ComboBox и получить доступ к внутреннему TextBox, например:
public class MyComboBox : ComboBox
{
TextBox _textBox;
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
_textBox = Template.FindName("PART_EditableTextBox", this) as TextBox;
if (_textBox != null)
{
_textBox.GotKeyboardFocus += _textBox_GotFocus;
this.Unloaded += MyComboBox_Unloaded;
}
}
void MyComboBox_Unloaded(object sender, System.Windows.RoutedEventArgs e)
{
_textBox.GotKeyboardFocus -= _textBox_GotFocus;
this.Unloaded -= MyComboBox_Unloaded;
}
void _textBox_GotFocus(object sender, System.Windows.RoutedEventArgs e)
{
_textBox.Select(_textBox.Text.Length, 0); // set caret to end of text
}
}
В вашем коде вы бы использовали его так:
<Window x:Class="EditableCbox.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:EditableCbox"
Title="Window1" Height="300" Width="300">
...
<local:MyComboBox x:Name="myComboBox" IsEditable="True" Grid.Row="0" Margin="4">
<ComboBoxItem>Alpha</ComboBoxItem>
<ComboBoxItem>Beta</ComboBoxItem>
<ComboBoxItem>Gamma</ComboBoxItem>
</local:MyComboBox>
...
</Window>
Это решение немного опасно, потому что в В будущих версиях WPF Microsoft может также решить добавить обработчик событий GotKeyboardFocus (или аналогичные обработчики событий), который может конфликтовать с обработчиком событий в MyComboBox.
Вы можете попробовать этот код:
var textBox = (comboBox.Template.FindName("PART_EditableTextBox", comboBox) as TextBox);
if (textBox != null)
{
textBox.Focus();
textBox.SelectionStart = textBox.Text.Length;
}