我在wpf中使用了一个可编辑的ComboBox但是当我尝试从C#代码设置焦点时,它只显示选择。但我想去编辑选项(光标应显示用户输入)。
答案 0 :(得分:9)
您可以尝试以下代码:
var textBox = (comboBox.Template.FindName("PART_EditableTextBox", comboBox) as TextBox);
if (textBox != null)
{
textBox.Focus();
textBox.SelectionStart = textBox.Text.Length;
}
答案 1 :(得分:3)
您可以尝试从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中的事件处理程序冲突。
答案 2 :(得分:3)
根据上面用户128300的回答,我提出了一个稍微简单的解决方案。在构造函数或ContextChangedHandler中,代码在将焦点放在UI元素上之前等待加载控件
myComboBox.GotFocus += MyComboBoxGotFocus;
myComboBox.Loaded += (o, args) => { myComboBox.Focus(); };
然后在焦点偶数处理程序中,我选择从开头到结尾的所有文本
private void MyComboBoxGotFocus(object sender, RoutedEventArgs e)
{
var textBox = myComboBox.Template.FindName("PART_EditableTextBox", myComboBox) as TextBox;
if (textBox != null)
textBox.Select(0, textBox.Text.Length);
}
在xaml中,组合框是可编辑的。通过在用户键入键时选择所有文本,它将重置之前的值
<ComboBox x:Name="myComboBox" IsEditable="True" />
答案 3 :(得分:0)
根据Rikker Serg的回答,您可以在构造函数中使用该代码(在InitializeComponent之后)并调度它而不需要创建自定义控件或事件处理程序。
public NewMessageWindow()
{
InitializeComponent();
Dispatcher.BeginInvoke(new Action(() =>
{
var textBox = myComboBox.Template.FindName("PART_EditableTextBox", cbUsers) as TextBox;
if (textBox != null)
{
textBox.Focus();
textBox.SelectionStart = textBox.Text.Length;
}
}));
}