单击WPF可编辑的ComboBox SelectAll

时间:2015-06-12 05:40:16

标签: c# wpf combobox wpf-controls

我在点击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,现在显示下拉列表;但是当一旦点击该框然后尝试打开下拉列表时 - 窗口就会冻结。 但是,我已经做了一个工作,我在下面提出了我的答案。如果这是一个正确而安全的解决方案,我会非常感谢您的意见。

3 个答案:

答案 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”,此处每次模板更改只执行一次