我在点击TextBox时有了如何选择所有文字;我想为可编辑的组合框做同样的事情 - 发现任何东西。我的TextBox代码是
private void OnPreviewMouseDown(Object sender, MouseButtonEventArgs e)
{
txtBox.SelectAll();
txtBox.Focus();
e.Handled = true;
}
如何为可编辑组合框做同样的事情?
更新 Combox代码,它为我提供了我想要的输出:
private void cboMouseDown(object sender, MouseButtonEventArgs e)
{
var textBox = (cbo.Template.FindName("PART_EditableTextBox", cbo) as TextBox);
if (textBox != null)
{
textBox.SelectAll();
cbo.Focus();
e.Handled = true;
}
}
但是现在组合框的下拉不起作用,有什么建议吗?
更新-2 :而不是PreviewMouseDown - 我尝试过PreviewMouseUp,现在显示下拉列表;但是当一旦点击该框然后尝试打开下拉列表时 - 窗口就会冻结。 但是,我已经做了一个工作,我在下面提出了我的答案。如果这是一个正确而安全的解决方案,我会非常感谢您的意见。
答案 0 :(得分:6)
使用GotFocus事件并选择此类文本
var comboTextBoxChild = comboBox.FindChild(typeof(TextBox), "PART_EditableTextBox") as TextBox;
comboTextBoxChild .SelectAll();
这里的组合框是你的可编辑组合名称
答案 1 :(得分:4)
我得到的一个可能的解决方案,它为我工作 - 如果它没有问题,需要一些建议;我正在使用ComboBox的PreviewMouseUp事件:
private void cboMouseUp(object sender, MouseButtonEventArgs e)
{
var textBox = (cbo.Template.FindName("PART_EditableTextBox", cbo) as TextBox);
if (textBox != null && !cbo.IsDropDownOpen)
{
Application.Current.Dispatcher.BeginInvoke(new Action(()=>{
textBox.SelectAll();
textBox.Focus();
//e.Handled = true;
}));
}
答案 2 :(得分:1)
我参加派对有点晚了,但我最近遇到了同样的问题,在测试了几个解决方案后,我想出了自己的(我为此创建了自定义控件):
public class ComboBoxAutoSelect : ComboBox
{
private TextBoxBase textBox;
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
textBox = GetTemplateChild("PART_EditableTextBox") as TextBoxBase;
}
protected override void OnPreviewGotKeyboardFocus(KeyboardFocusChangedEventArgs e)
{
// if event is called from ComboBox itself and not from any of underlying controls
// and if textBox is defined in control template
if (e.OriginalSource == e.Source && textBox != null)
{
textBox.Focus();
textBox.SelectAll();
e.Handled = true;
}
else
{
base.OnPreviewGotKeyboardFocus(e);
}
}
}
您可以对事件执行相同操作,但每次都需要搜索“PART_EditableTextBox”,此处每次模板更改只执行一次