使WinForms TextBox的行为类似于浏览器的地址栏


154

当C#WinForms文本框获得焦点时,我希望它的行为类似于浏览器的地址栏。

要了解我的意思,请在网络浏览器的地址栏中单击。您会注意到以下行为:

  1. 如果文本框以前未聚焦,则单击文本框应选择所有文本。
  2. 向下滑动并在文本框中拖动应只选择我用鼠标突出显示的文本。
  3. 如果文本框已经聚焦,则单击不会选择所有文本。
  4. 以编程方式或通过键盘制表键聚焦文本框应选择所有文本。

我想在WinForms中完全做到这一点。

最快的预警:请在回答之前阅读以下内容!多谢你们。:-)

在.Enter或.GotFocus事件期间调用.SelectAll()无效,因为如果用户单击文本框,则插入符号将放置在其单击位置,从而取消选择所有文本。

在.Click事件中调用.SelectAll()无效,因为用户将无法使用鼠标选择任何文本。.SelectAll()调用将继续覆盖用户的文本选择。

在焦点/进入事件enter上调用BeginInvoke((Action)textbox.SelectAll)无效,因为它违反了上面的规则2,它将继续覆盖用户对焦点的选择。


3
请说明这是针对“ RichTextBox”的。
Nescio

Nescio,文本框或富文本框都可以。我也在文本框中尝试了您的解决方案。
Judah Gabriel Himango,

这是一个抽象泄漏。最好的方法是在未WM_MOUSEACTIVATE的情况下在WM_SETFOCUS上标记WM_MOUSEACTIVATE和SelectAll。
wqw 2010年

Answers:


109

首先,感谢您的回答!共9个答案。谢谢。

坏消息:所有答案都有一些古怪之处,或者说不是很正确(或根本没有)。我已在您的每个帖子中添加了评论。

好消息:我已经找到一种使之工作的方法。该解决方案非常简单,并且似乎可以在所有情况下使用(向下移动,选择文本,以制表符为焦点等)

bool alreadyFocused;

...

textBox1.GotFocus += textBox1_GotFocus;
textBox1.MouseUp += textBox1_MouseUp;
textBox1.Leave += textBox1_Leave;

...

void textBox1_Leave(object sender, EventArgs e)
{
    alreadyFocused = false;
}


void textBox1_GotFocus(object sender, EventArgs e)
{
    // Select all text only if the mouse isn't down.
    // This makes tabbing to the textbox give focus.
    if (MouseButtons == MouseButtons.None)
    {
        this.textBox1.SelectAll();
        alreadyFocused = true;
    }
}

void textBox1_MouseUp(object sender, MouseEventArgs e)
{
    // Web browsers like Google Chrome select the text on mouse up.
    // They only do it if the textbox isn't already focused,
    // and if the user hasn't selected all text.
    if (!alreadyFocused && this.textBox1.SelectionLength == 0)
    {
        alreadyFocused = true;
        this.textBox1.SelectAll();
    }
}

据我所知,这会使文本框的行为与Web浏览器的地址栏完全相同。

希望这有助于下一个尝试解决这个看似简单的问题的人。

再次感谢大家提供的所有答案,这些答案帮助我迈向了正确的道路。


以编程方式将焦点设置到TextBox怎么办?我遇到了这里讨论的问题:stackoverflow.com/questions/24790704/…经过一番尝试,我能够解决它,但是我仍然对此感到紧张,因为我的“修复”似乎很笨拙。
B. Clay Shannon

您写道:“在.Enter或.GotFocus事件期间调用.SelectAll()将不起作用,因为如果用户单击文本框,则插入符号将放置在其单击位置,从而取消选择所有文本。” 我在GotFocus事件中确实拥有SelectAll,在大多数情况下,它都可以工作。实际上,我认为将光标放置在用户单击的位置是“一件好事”。我只是希望在通过编程将焦点设置为TextBox时始终选择它。
B. Clay Shannon 2014年

我又在这里!:)
dotNET 2014年

3
您应该将alreadyFocused = true;MouseUp中的if语句移出。因为如果您立即选择文本的一部分,则下次单击将再次选择整个文本。
罗伯特S.16

下面有一个衬纸答案--- BeginInvoke((Action)MyTextBox.SelectAll); ---值得一看。它似乎满足了所有要求的条件
通用格雷

78

我找到了一个更简单的解决方案。它涉及使用以下方式异步启动SelectAllControl.BeginInvoke以便在发生Enter和Click事件之后发生:

在C#中:

private void MyTextBox_Enter(object sender, EventArgs e)
{
    // Kick off SelectAll asyncronously so that it occurs after Click
    BeginInvoke((Action)delegate
    {
        MyTextBox.SelectAll();
    });
}

在VB.NET中(感谢Krishanu Dey

Private Sub MyTextBox_Enter(sender As Object, e As EventArgs) Handles MyTextBox.Enter 
    BeginInvoke(DirectCast(Sub() MyTextBox.SelectAll(), Action)) 
End Sub

5
我找到的最明智的答案..非常感谢..对于VB.net,这是解决方案.. Private Sub MyTextBox_Enter(sender As Object, e As EventArgs) Handles MyTextBox.Enter BeginInvoke(DirectCast(Sub() MyTextBox.SelectAll(), Action)) End Sub
Krishanu Dey 2013年

最好的类解决方案,例如Web浏览器URL栏,很多类结束类
ar.dll 2014年

7
在.Net 4.0中,您可以执行以下操作:BeginInvoke((Action)MyTextBox.SelectAll);
JoelFan 2014年

2
不幸的是,BeginInvoke对我不起作用(毫无疑问,由于我尘土飞扬的Dot net版本)。前置“控件”。这样做无济于事,也不能在TextBox本身的名称前加上名称。独自一人,微微游荡...
B. Clay Shannon

2
请注意,此解决方案的行为与问题中所描述的不完全相同。特别地,Mouse down and drag in the textbox should select only the text I've highlighted with the mouse.它不能像期望的那样工作。但仍然是最短,最优雅的解决方案:)
Marcus Mangelsdorf

30

您的解决方案很好,但是在一种特定情况下失败。如果通过选择文本范围而不是仅单击文本来使TextBox成为焦点,则notFocussed标志不会设置为true,因此,当您第二次单击TextBox时,将选中所有文本。

这是我的解决方案版本。我还将代码放入继承TextBox的类中,因此逻辑被很好地隐藏了。

public class MyTextBox : System.Windows.Forms.TextBox
{
    private bool _focused;

    protected override void OnEnter(EventArgs e)
    {
        base.OnEnter(e);
        if (MouseButtons == MouseButtons.None)
        {
            SelectAll();
            _focused = true;
        }
    }

    protected override void OnLeave(EventArgs e)
    {
        base.OnLeave(e);
        _focused = false;
    }

    protected override void OnMouseUp(MouseEventArgs mevent)
    {
        base.OnMouseUp(mevent);
        if (!_focused)
        {
            if (SelectionLength == 0)
                SelectAll();
            _focused = true;
        }
    }
}

2
+1提供自定义文本框建议和完美的解决方案!
加油

很棒的解决方案。将您的代码直接复制到我的解决方案中,更改了名称空间以保护无辜的用户,并且运行良好。谢谢!
kenswdev

8

这有点麻烦,但是在您的click事件中,请使用SendKeys.Send( "{HOME}+{END}" );


哇!有点骇客!:-)谢谢你的建议。还有更好的主意吗?
Judah Gabriel Himango

确实确实在黑客入侵,但这听起来并不坏
Terry

3
考虑到许多防病毒程序都将SEND KEYS拦截并阻止为恶意软件。这不是一个很好的解决方案。
Judah Gabriel Himango 2010年

4

文本框的点击事件?甚至MouseCaptureChanged事件都对我有用。- 好。不起作用。

因此,您必须做两件事:

private bool f = false;

private void textBox_MouseClick(object sender, MouseEventArgs e)
{ 
  if (this.f) { this.textBox.SelectAll(); }
  this.f = false;
}

private void textBox_Enter(object sender, EventArgs e)
{
  this.f = true;
  this.textBox.SelectAll();
}
private void textBox_MouseMove(object sender, MouseEventArgs e) // idea from the other answer
{
  this.f = false; 
}

也适用于制表符(通过文本框到该选项卡)-以防万一,在Enter中调用SelectAll()。


好的,雅库布,部分有效。如果我转到文本框,则需要重点关注。那将与您的解决方案一起工作吗?(如果您可以告诉我如何做,我会将您的答案标记为正确的答案。)
Judah Gabriel Himango

Jakub,既然您已经发布了代码,它似乎有时可以工作。不总是; 现在,我单击文本框,但未全部选中。
Judah Gabriel Himango,

有时,我会单击文本,但不会全部选中。就像.f字段没有设置为应有的样子,然后SelectAll不会被调用。还没看过吗
Judah Gabriel Himango

我只知道,由于使用mouseMouve,您可以在移动鼠标(尤其是宽字母)时缓慢单击鼠标->取消设置标志。您可以删除mouseMove事件中的代码,但得到的结果是-要控制Tabbgin之后再单击-reSelectAll-在第一次拖动时无法选择搅拌的一部分
Jakub Kotrla

4

我使用的一行答案...您可能会踢自己...

在Enter事件中:

txtFilter.BeginInvoke(new MethodInvoker(txtFilter.SelectAll));


1
不,不行。可以选择所有文本,但是,除了其他问题之外,它还可以防止用户选择部分文本。
Judah Gabriel Himango

抱歉,我一定误会了您想要的行为。输入时,它会选择所有内容,如果您单击并按住它,则从头开始选择光标。我想您可以使用现有的东西,并用您自己的选择逻辑替换SelectAll。 notifywire.com/demos/2009-04-14_1248.swf

很棒!首先单击进入框;然后单击并拖动以选择文本。
D_Bester

注意:它不能像网络浏览器的地址栏一样工作。使用网络浏览器的地址栏,即使文本框尚未聚焦,您也可以在文本框中向下拖动并拖动/选择。此解决方案无法解决该问题。如果可以,请冷静,但不能满足此问题的要求。
Judah Gabriel Himango'8

3
'Inside the Enter event
TextBox1.SelectAll();

好的,尝试之后,这里就是您想要的:

  • 在Enter事件上,启动一个标志,表明您已进入enter事件
  • 在Click事件上,如果设置了标志,请调用.SelectAll()并重置标志。
  • 在MouseMove事件上,将输入的标志设置为false,这将允许您单击突出显示,而不必先输入文本框。

这选择了所有输入的文本,但是允许我随后突出显示部分文本,或者允许您在第一次单击时突出显示。

按要求:

    bool entered = false;
    private void textBox1_Enter(object sender, EventArgs e)
    {
        entered = true;
        textBox1.SelectAll();   //From Jakub's answer.
    }

    private void textBox1_Click(object sender, EventArgs e)
    {
        if (entered) textBox1.SelectAll();
        entered = false;
    }

    private void textBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (entered) entered = false;
    }

对我来说,跳到控件中会选择所有文本。


您的解决方案类似于Jakub的解决方案。单击即可使用。转到文本框时可以使用吗?(例如,跳到浏览器的地址栏也会选择所有文本。)
Judah Gabriel Himango

是的,它也适用于制表符。我编写了一个测试应用程序,这就是使它运行的方式。
MagicKat

似乎不适用于制表符。您可以向我们展示可用于制表的代码吗?
Judah Gabriel Himango

3

这是一个帮助程序功能,它将解决方案提高到了一个新级别-无需继承即可重用。

    public static void WireSelectAllOnFocus( TextBox aTextBox )
    {
        bool lActive = false;
        aTextBox.GotFocus += new EventHandler( ( sender, e ) =>
        {
            if ( System.Windows.Forms.Control.MouseButtons == MouseButtons.None )
            {
                aTextBox.SelectAll();
                lActive = true;
            }
        } );

        aTextBox.Leave += new EventHandler( (sender, e ) => {
            lActive = false;
        } );

        aTextBox.MouseUp += new MouseEventHandler( (sender, e ) => {
            if ( !lActive )
            {
                lActive = true;
                if ( aTextBox.SelectionLength == 0 ) aTextBox.SelectAll();
            }   
        });
    }

要使用此功能,只需调用传递TextBox的函数即可,它会为您处理所有混乱的位。我建议在Form_Load事件中连接所有文本框。您可以将此函数放置在您的表单中,或者如果您喜欢我,可以将其放置在实用工具类中的某个位置以进行更多重用。


2

这适用于WPF / XAML文本框。

    private bool initialEntry = true;
    private void TextBox_SelectionChanged(object sender, RoutedEventArgs e)
    {
        if (initialEntry)
        {
            e.Handled = true;
            initialEntry = false;
            TextBox.SelectAll();
        }
    }
    private void TextBox_GotFocus(object sender, RoutedEventArgs e)
    {
        TextBox.SelectAll();
        initialEntry = true;      
    }

2

这类似于nzhenry的流行答案,但是我发现不必继承子类更容易:

Private LastFocused As Control = Nothing

Private Sub TextBox1_Enter(sender As Object, e As System.EventArgs) Handles TextBox1.Enter, TextBox2.Enter, TextBox3.Enter
    If MouseButtons = Windows.Forms.MouseButtons.None Then LastFocused = sender
End Sub

Private Sub TextBox1_Leave(sender As Object, e As System.EventArgs) Handles TextBox1.Leave, TextBox2.Leave, TextBox3.Leave
    LastFocused = Nothing
End Sub

Private Sub TextBox1_MouseUp(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseUp, TextBox2.MouseUp, TextBox3.MouseUp
    With CType(sender, TextBox)
        If LastFocused IsNot sender AndAlso .SelectionLength = 0 Then .SelectAll()
    End With
    LastFocused = sender
End Sub

1

SelectAll从来没有为我工作。

这可行。

ActiveControl = textBox1;
textBox1->SelectionStart = 0;
textBox1->SelectionLength = textBox1->Text->Length;

这并不说明在文本框中使用制表符会带来焦点的情况。它还显示了该线程中讨论的其他一些问题。
Judah Gabriel Himango'5

1

我找到了一个更简单的解决方案:

若要确保在单击文本框时选择了所有文本,请确保Click处理程序调用Enter处理程序。不需要额外的变量!

例:

private void textBox1_Click(object sender, EventArgs e){
        textBox1_Enter(sender, e);
    }

private void textBox1_Enter(object sender, EventArgs e){
        TextBox tb = ((TextBox)sender);
        tb.SelectAll();
    }

通过Tab键进入控件无法获得焦点,对吗?另外,当您想选择一些文本而不选择全部时该怎么办?
Judah Gabriel Himango 2015年

实际上,它确实适用于Tab键!我刚刚使用MS Visual C#2010在一个虚拟项目中对其进行了测试。此解决方案令人讨厌的事情是,如果不选择全部,就不能选择某些文本。如果您只想这样做,那么当然不需要代码,您只需使用鼠标并选择它(或使用键盘)即可。
Pieter Heemeryck

这就是为什么此解决方案无法解决所出现的问题的原因:它的行为不像浏览器地址框,因为如果不选择所有文本,就无法单击地址的各个部分。
Judah Gabriel Himango 2015年

好,我明白你的意思了。问题的标题和Web浏览器的地址栏示例并未表明您应该能够选择文本的某些部分。您仅在问题的最后一句中提到了这一点。问候。
Pieter Heemeryck

0
private bool _isSelected = false;
private void textBox_Validated(object sender, EventArgs e)
{
    _isSelected = false;
}

private void textBox_MouseClick(object sender, MouseEventArgs e)
{
    SelectAllText(textBox);
}

private void textBox_Enter(object sender, EventArgs e)
{
    SelectAllText(textBox);
}

private void SelectAllText(TextBox text)
{
    if (!_isSelected)
    {
        _isSelected = true;
        textBox.SelectAll();
    }
}

我刚刚使用RichTextBox进行了测试。不起作用 单击进入文本框似乎不会选择所有文本。(因为将光标插入到光标处时,它已在鼠标按下时取消选择。)
Judah Gabriel Himango

0

有趣的是,我认为,具有DropDownStyle = Simple的ComboBox几乎具有您正在寻找的行为。

(如果减小控件的高度以不显示列表,然后再增加几个像素,则ComboBox和TextBox之间没有有效的区别。)


有趣,但是我真的需要在TextBox和RichTextBox上使用它。
Judah Gabriel Himango,2009年

0

为什么不简单地使用文本框的MouseDown-Event?它对我来说很好用,不需要额外的布尔值。非常干净和简单,例如:

private void textbox_MouseDown(object sender, MouseEventArgs e) {
    if (textbox != null && !string.IsNullOrEmpty(textbox.Text))
    {
        textbox.SelectAll();
    } }

否,这有几个问题:无法说明文本框是否已经具有焦点(我们不想在文本框没有焦点时选择全部按下鼠标),不能让您仅选择文本的一部分,通过制表符移至文本框以将焦点移到该文本时不起作用。
Judah Gabriel Himango,

0

我在MouseUp事件中调用了SelectAll,对我来说效果很好。

    private bool _tailTextBoxFirstClick = false;

    private void textBox1_MouseUp(object sender, MouseEventArgs e)
    {
        if(_textBoxFirstClick)           
            textBox1.SelectAll();

        _textBoxFirstClick = false;
    }  

    private void textBox1_Leave(object sender, EventArgs e)
    {
        _textBoxFirstClick = true;
        textBox1.Select(0, 0);
    }

是的,请参阅其他答案(和评论),以了解为什么这并非在所有情况下都有效。
Judah Gabriel Himango

我没有为此选项卡检查选项卡。我的错。感谢您指出。很高兴看到您现在拥有完整的解决方案。并且也很高兴知道我对MouseUp的建议已包含在您的解决方案中。
Sreejith K.

0

只需从TextBox或MaskedTextBox派生一个类:

public class SMaskedTextBox : MaskedTextBox
{
    protected override void OnGotFocus(EventArgs e)
    {
        base.OnGotFocus(e);
        this.SelectAll();
    }
}

并在您的表单上使用它。


这行不通。要了解原因,请参阅其他答案和评论。
Judah Gabriel Himango 2010年


0

实际上,GotFocus是您感兴趣的正确事件(实际上是消息),因为无论您如何控制控件,您最终都将得到它。问题是何时调用SelectAll()。

试试这个:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.textBox1.GotFocus += new EventHandler(textBox1_GotFocus);
    }

    private delegate void SelectAllDelegate();    
    private IAsyncResult _selectAllar = null; //So we can clean up afterwards.

    //Catch the input focus event
    void textBox1_GotFocus(object sender, EventArgs e)
    {
        //We could have gotten here many ways (including mouse click)
        //so there could be other messages queued up already that might change the selection.
        //Don't call SelectAll here, since it might get undone by things such as positioning the cursor.
        //Instead use BeginInvoke on the form to queue up a message
        //to select all the text after everything caused by the current event is processed.
        this._selectAllar = this.BeginInvoke(new SelectAllDelegate(this._SelectAll));
    }

    private void _SelectAll()
    {
        //Clean-up the BeginInvoke
        if (this._selectAllar != null)
        {
            this.EndInvoke(this._selectAllar);
        }
        //Now select everything.
        this.textBox1.SelectAll();
    }
}

阿里,这行不通。尝试将鼠标放在文本中间。按住鼠标按钮1秒钟。
Judah Gabriel Himango,

0

对于表单中的一组文本框:

private System.Windows.Forms.TextBox lastFocus;   

private void textBox_GotFocus(object sender, System.Windows.Forms.MouseEventArgs e)   
{
    TextBox senderTextBox = sender as TextBox;
    if (lastFocus!=senderTextBox){
        senderTextBox.SelectAll();
    }
    lastFocus = senderTextBox;   
}

1
这不能正常工作。请参阅我对其他建议.SelectAll()的答复。这是行不通的,因为如果您在尝试选择文本时输入文本框,则会通过选择所有文本来中断文本选择。仅当焦点通过鼠标上移或跳入文本框进入文本框时才选择文本,但是焦点是通过鼠标下移引起的。
Judah Gabriel Himango 2011年

0

我知道这已经解决了,但我建议我认为实际上很简单。

在鼠标上移事件中,您要做的就是放置

if(textBox.SelectionLength = 0)
{
    textBox.SelectAll();
}

它似乎在VB.NET中对我有用(我知道这是一个C#问题...可悲的是我被迫在工作中使用VB ..而我遇到了这个问题,这就是让我来到这里的原因... )

我还没有发现任何问题..除了它没有立即选择单击,但我对此有问题...。


1
最初的请求也希望在您也进入该字段时也可以使用。
Don Kirkby 2012年

2
是的,这并不适用于所有情况。仅当您单击文本框时,它才起作用。即使这样,当文本框中的选择已经存在时,如果行为不像浏览器,那么地址栏也会表现出来。
Judah Gabriel Himango 2012年

0

以下解决方案对我有效。我添加了事件OnKeyDownOnKeyUp覆盖了它,以使TextBox文本始终处于选中状态。

    public class NumericTextBox : TextBox
{
    private bool _focused;
    protected override void OnGotFocus(EventArgs e)
    {
        base.OnGotFocus(e);
        if (MouseButtons == MouseButtons.None)
        {
            this.SelectAll();
            _focused = true;
        }
    }
    protected override void OnEnter(EventArgs e)
    {
        base.OnEnter(e);
        if (MouseButtons == MouseButtons.None)
        {
            SelectAll();
            _focused = true;
        }
    }

    protected override void OnLeave(EventArgs e)
    {
        base.OnLeave(e);
        _focused = false;
    }

    protected override void OnMouseUp(MouseEventArgs mevent)
    {
        base.OnMouseUp(mevent);
        if (!_focused)
        {
            if (SelectionLength == 0)
                SelectAll();
            _focused = true;
        }
    }

    protected override void OnKeyUp(KeyEventArgs e)
    {
        base.OnKeyUp(e);

        if (SelectionLength == 0)
            SelectAll();
        _focused = true;
    }
    protected override void OnKeyDown(KeyEventArgs e)
    {
       base.OnKeyDown(e);
       if (SelectionLength == 0)
            SelectAll();
        _focused = true;
    }
}

2
它是否允许您向下拖动鼠标到文本框中,拖动光标以选择一些文本,然后向上拖动鼠标?
Judah Gabriel Himango'8

0

离开控件时设置选择。当您回来时它将在那里。在表单周围使用Tab键,然后返回到控件时,将选中所有文本。

如果您使用鼠标进入,则插入标记将正确地放置在您单击的位置。

private void maskedTextBox1_Leave(object sender, CancelEventArgs e)
    {
        maskedTextBox1.SelectAll();
    }

如果您使用鼠标进入,它应该选择所有文本,除非它已经被聚焦。这不支持。
Judah Gabriel Himango 2013年

0

很简单的解决方案:

    private bool _focusing = false;

    protected override void OnEnter( EventArgs e )
    {
        _focusing = true;
        base.OnEnter( e );
    }

    protected override void OnMouseUp( MouseEventArgs mevent )
    {
        base.OnMouseUp( mevent );

        if( _focusing )
        {
            this.SelectAll();
            _focusing = false;
        }
    }

编辑:原始OP特别关注鼠标向下/文本选择/鼠标向上的顺序,在这种情况下,上述简单的解决方案最终会导致文本被部分选中。

这应该可以解决*问题(实际上,我拦截了WM_SETCURSOR):

    protected override void WndProc( ref Message m )
    {
        if( m.Msg == 32 ) //WM_SETCURSOR=0x20
        {
              this.SelectAll(); // or your custom logic here                
        }

        base.WndProc( ref m );
    }

*实际上,以下序列以部分文本选择结束,但是如果将鼠标移到文本框上,则会再次选择所有文本:

鼠标向下/文本选择/鼠标移出文本框/鼠标向上


该解决方案已经发布。请参阅现有答案的注释,以了解为什么它不起作用。
Judah Gabriel Himango 2014年

与Tab和鼠标配合使用时,您可以获取焦点,选择文本,然后将鼠标向上。我似乎找不到这个问题。你能指出吗?
2014年

0

当鼠标单击而不是立即释放时,我发现此方法最有效:

    private bool SearchBoxInFocusAlready = false;
    private void SearchBox_LostFocus(object sender, RoutedEventArgs e)
    {
        SearchBoxInFocusAlready = false;
    }

    private void SearchBox_PreviewMouseUp(object sender, MouseButtonEventArgs e)
    {
        if (e.ButtonState == MouseButtonState.Released && e.ChangedButton == MouseButton.Left &&
            SearchBox.SelectionLength == 0 && SearchBoxInFocusAlready == false)
        {
            SearchBox.SelectAll();
        }

        SearchBoxInFocusAlready = true;
    }

0

我的解决方案很原始,但可以很好地达到我的目的

private async void TextBox_GotFocus(object sender, RoutedEventArgs e)
{
    if (sender is TextBox)
    {
        await Task.Delay(100);
        (sender as TextBox).SelectAll();
    }
}

当您要向下移动鼠标以选择一堆文本,拖动鼠标然后向上移动鼠标时,此功能不起作用。您的代码将清除选择并选择所有内容。
Judah Gabriel Himango

@JudahHimango Jup。如果单击,它将选择所有内容。如果单击并拖动,它将仅选择选择。至少Firefox中的Browserbar确实显示了这种行为。
BlueWizard

这不是比赛条件吗?如果我设法用鼠标快速选择一些文本,则.SelectAll()将在毫秒后触发,从而覆盖了我的选择。
Judah Gabriel Himango 2015年

1
好的,如果您能快速选择事物,那么此事物将对您不利。
BlueWizard

-1

以下似乎有效。enter事件处理到控件的选项卡,单击控件时MouseDown起作用。

    private ########### void textBox1_Enter(object sender, EventArgs e)
    {
        textBox1.SelectAll();
    }

    private void textBox1_MouseDown(object sender, MouseEventArgs e)
    {
        if (textBox1.Focused)
            textBox1.SelectAll();
    }

没运气,恐怕是行不通的。尝试选择一些文本。.SelectAll文本将覆盖用户尝试选择的内容。
Judah Gabriel Himango

-1

答案实际上比上面的所有答案都简单得多,例如(在WPF中):

public void YourTextBox_MouseEnter(object sender, MouseEventArgs e)
    {
        YourTextBox.Focus();
        YourTextBox.SelectAll();
    }

当然,我不知道您想如何使用此代码,但是这里要看的主要部分是:首先调用.Focus(),然后调用.SelectAll();。


这是行不通的,并且是其他答案的重复。例如,如果您在文本框中向下拖动,请拖动,它将选择文本的一部分。这打破了这一点,并没有全部选中。
Judah Gabriel Himango '16

-1

只需在enter和click事件上使用selectall()

private void textBox1_Enter(object sender, EventArgs e)
        {

            textBox1.SelectAll();
        }
        private void textBox1_Click(object sender, EventArgs e)
        {
            textBox1.SelectAll();
        }

在您要选择一些文本之前,该方法一直有效。请参阅其他答案以获取完整说明。
Judah Gabriel Himango 2015年

-1

我创建了一个新的VB.Net Wpf项目。我创建了一个文本框,并将以下内容用于代码隐藏:

Class MainWindow 

    Sub New()

        ' This call is required by the designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.
        AddHandler PreviewMouseLeftButtonDown, New MouseButtonEventHandler(AddressOf SelectivelyIgnoreMouseButton)
        AddHandler GotKeyboardFocus, New KeyboardFocusChangedEventHandler(AddressOf SelectAllText)
        AddHandler MouseDoubleClick, New MouseButtonEventHandler(AddressOf SelectAllText)
    End Sub

    Private Shared Sub SelectivelyIgnoreMouseButton(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
        ' Find the TextBox
        Dim parent As DependencyObject = TryCast(e.OriginalSource, UIElement)
        While parent IsNot Nothing AndAlso Not (TypeOf parent Is TextBox)
            parent = VisualTreeHelper.GetParent(parent)
        End While

        If parent IsNot Nothing Then
            Dim textBox As Object = DirectCast(parent, TextBox)
            If Not textBox.IsKeyboardFocusWithin Then
                ' If the text box is not yet focussed, give it the focus and
                ' stop further processing of this click event.
                textBox.Focus()
                e.Handled = True
            End If
        End If
    End Sub

    Private Shared Sub SelectAllText(ByVal sender As Object, ByVal e As RoutedEventArgs)
        Dim textBox As Object = TryCast(e.OriginalSource, TextBox)
        If textBox IsNot Nothing Then
            textBox.SelectAll()
        End If
    End Sub

End Class
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.