У меня была та же самая проблема, и, как некоторые пользователи, которые были новичками в WPF, изо всех сил пытались заставить работать решение, данное Эйнаром Гудштейнссоном. Таким образом, в поддержку его ответа я вставляю здесь шаги, чтобы заставить это работать. (Или, точнее, как я это сделал).
Сначала создайте пользовательский класс combobox, который наследуется от класса Combobox. Смотрите код ниже для полной реализации. Вы можете изменить код в OnDropSelectionChanged в соответствии с вашими индивидуальными требованиями.
namespace MyCustomComboBoxApp
{
использование System.Windows.Controls;
public class MyCustomComboBox : ComboBox
{
private int caretPosition;
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
var element = GetTemplateChild("PART_EditableTextBox");
if (element != null)
{
var textBox = (TextBox)element;
textBox.SelectionChanged += OnDropSelectionChanged;
}
}
private void OnDropSelectionChanged(object sender, System.Windows.RoutedEventArgs e)
{
TextBox txt = (TextBox)sender;
if (base.IsDropDownOpen && txt.SelectionLength > 0)
{
txt.CaretIndex = caretPosition;
}
if (txt.SelectionLength == 0 && txt.CaretIndex != 0)
{
caretPosition = txt.CaretIndex;
}
}
}
Убедитесь, что этот пользовательский комбинированный класс существует в том же проекте. Тогда вы можете использовать приведенный ниже код для ссылки на этот комбо в вашем пользовательском интерфейсе.
<Window x:Class="MyCustomComboBoxApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cc="clr-namespace:MyCustomComboBoxApp"
Title="MainWindow" Height="350" Width="525" FocusManager.FocusedElement="{Binding ElementName=cb}">
<Grid>
<StackPanel Orientation="Vertical">
<cc:MyCustomComboBox x:Name="cb" IsEditable="True" Height="20" Margin="10" IsTextSearchEnabled="False" KeyUp="cb_KeyUp">
<ComboBoxItem>Toyota</ComboBoxItem>
<ComboBoxItem>Honda</ComboBoxItem>
<ComboBoxItem>Suzuki</ComboBoxItem>
<ComboBoxItem>Vauxhall</ComboBoxItem>
</cc:MyCustomComboBox>
</StackPanel>
</Grid>
</Window>
Вот и все! Любые вопросы, пожалуйста, задавайте! Я сделаю все возможное, чтобы помочь.
Спасибо Эйнару Гудштейнссону за его решение!