WinForms TextBox'ın tarayıcınızın adres çubuğu gibi davranmasını sağlama


154

Bir C # WinForms metin kutusu odak aldığında, tarayıcınızın adres çubuğu gibi davranmasını istiyorum.

Ne demek istediğimi görmek için web tarayıcınızın adres çubuğunda simgesini tıklayın. Aşağıdaki davranışı fark edeceksiniz:

  1. Metin kutusu daha önce odaklanmamışsa, metin kutusuna tıklamak tüm metni seçmelidir.
  2. Fareyi aşağı kaydırın ve metin kutusuna sürükleyin, yalnızca fareyle vurguladığım metni seçmelidir.
  3. Metin kutusu zaten odaklanmışsa, tıklatmak tüm metni seçmez.
  4. Metin kutusunu programlı olarak veya klavye sekmesi yoluyla odaklamak tüm metni seçmelidir.

Bunu tam olarak WinForms'da yapmak istiyorum.

EN HIZLI SİLAH UYARISI: cevaplamadan önce lütfen aşağıdakileri okuyun! Teşekkürler beyler. :-)

.Enter veya .GotFocus olayları sırasında .SelectAll () öğesini çağırmak işe yaramaz, çünkü kullanıcı metin kutusunu tıkladığında, düzeltme işareti tıklattığı yere yerleştirilir ve böylece tüm metinlerin seçimi kaldırılır.

.Click olayı sırasında .SelectAll () öğesini çağırmak , kullanıcı fare ile herhangi bir metin seçemeyeceği için çalışmaz; .SelectAll () çağrısı, kullanıcının metin seçiminin üzerine yazmaya devam edecektir.

Odaklama / enter olayı girmesindeki BeginInvoke ((Eylem) metin kutusu.SelectAll) çağrıldığında yukarıdaki kural # 2'yi ihlal ettiği için çalışmaz , kullanıcının odaktaki seçimini geçersiz kılmaya devam eder.


3
Lütfen bunun bir "RichTextBox" için olduğunu açıklayın.
Nescio

Nescio, bir metin kutusu veya zengin bir metin kutusu yapacak. Çözümünüzü bir metin kutusunda da denedim.
Judah Gabriel Himango

Bu bir soyutlama kaçağı. WM_MOUSEACTIVATE ing değilse WM_MOUSEACTIVATE ve SelectAll işaretlemek için bunu yapmanın en iyi yolu.
wqw

Yanıtlar:


109

Her şeyden önce, cevaplar için teşekkürler! Toplam 9 cevap. Teşekkür ederim.

Kötü haber: tüm cevapların bazı tuhaflıkları vardı ya da çok doğru (ya da hiç) işe yaramadı. Gönderilerinizin her birine bir yorum ekledim.

İyi haber: İşe yarayacak bir yol buldum. Bu çözüm oldukça basittir ve tüm senaryolarda (fareyle üzerine gelme, metin seçme, sekme odağı vb.)

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();
    }
}

Anlayabildiğim kadarıyla, bu bir metin kutusunun tam olarak bir web tarayıcısının adres çubuğu gibi davranmasına neden olur.

Umarım bu, bu aldatıcı basit sorunu çözmeye çalışan bir sonraki adama yardımcı olur.

Tekrar teşekkürler çocuklar, beni doğru yola götüren tüm cevaplarınız için.


Odak programlı olarak bir TextBox olarak ayarlandığında ne olur? Burada tartışıldığı gibi bir sorunum var: stackoverflow.com/questions/24790704/… Bir modadan sonra bunu çözebildim, ama yine de endişeliyim, çünkü "düzeltmem" oldukça yavaş görünüyor.
B. Clay Shannon

".Enter veya .GotFocus olayları sırasında .SelectAll () öğesini çağırmak işe yaramaz çünkü kullanıcı metin kutusunu tıkladığında, düzeltme işareti tıklattığı yere yerleştirilir ve böylece tüm metinlerin seçimi kaldırılır." Çoğunlukla çalışan GotFocus olayında SelectAll var. Aslında, kullanıcının tıkladığı yere yerleştirilen imlecin "iyi bir şey" olduğunu düşünürdüm. Sadece odak programlı olarak TextBox olarak ayarlandığında her zaman seçilmesini istiyorum.
B. Clay Shannon

Ve yine buradayım! :)
dotNET

3
alreadyFocused = true;MouseUp'taki if ifadesinin dışına taşımalısınız . Çünkü metnin bir bölümünü hemen seçerseniz, bir sonraki tıklama metnin tamamını tekrar seçecektir.
Robert

Aşağıda bir satır yanıtı vardır --- BeginInvoke ((Eylem) MyTextBox.SelectAll); --- Bakmaya değer. Gerekli her şeyi yapıyor gibi görünüyor
General Grey

78

Bunun için daha basit bir çözüm buldum. Control.BeginInvokeEnter ve Click olayları gerçekleştikten sonra gerçekleşmesi için SelectAll'ı eşzamansız olarak kullanarak başlatmayı içerir :

C # dilinde:

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'te ( Krishanu Dey sayesinde )

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

5
Şimdiye kadar bulduğum en akıllı cevap .. Çok teşekkürler .. VB.net için İşte Çözüm .. Private Sub MyTextBox_Enter(sender As Object, e As EventArgs) Handles MyTextBox.Enter BeginInvoke(DirectCast(Sub() MyTextBox.SelectAll(), Action)) End Sub
Krishanu Dey

Class Much 'En iyi çözüm, bu web tarayıcı URL çubuğu, çok sınıf End Class
ar.dll

7
Net 4.0'da şunları yapabilirsiniz: BeginInvoke ((Eylem) MyTextBox.SelectAll);
JoelFan

2
Ne yazık ki, BeginInvoke benim için çalışmıyor (Dot net'in felaketle tozlu versiyonumdan şüphesiz). "Kontrol" ekleniyor. buna yardımcı olmaz, ya da TextBox'ın isminin başını eklemez. Yalnız ve solukça loitering ...
B. Clay Shannon

2
Bu çözümün tam olarak soruda açıklandığı gibi davranmadığını unutmayın. Özellikle Mouse down and drag in the textbox should select only the text I've highlighted with the mouse.istendiği gibi çalışmaz. Ama yine de en kısa ve en zarif çözüm :)
Marcus Mangelsdorf

30

Çözümünüz iyi, ancak belirli bir durumda başarısız oluyor. TextBox'a sadece tıklamak yerine bir metin aralığı seçerek odak verirseniz, zaten Odaklanmış bayrağı true değerine ayarlanmaz, bu nedenle TextBox'a ikinci kez tıkladığınızda tüm metin seçilir.

İşte benim çözüm versiyonum. Ben de mantık güzel bir şekilde gizli böylece TextBox miras, bir sınıfa kod koydum.

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
Özel metin kutusu önerisi ve mükemmel çalışan çözüm için +1!
Yakıtlı

Müthiş çözüm. Kodunuzu doğrudan çözümüme kopyaladım, masumluğu korumak için ad alanını değiştirdi ve mükemmel çalıştı. Teşekkürler!
kenswdev

8

Biraz kludgey, ancak tıklama etkinliğinizde kullanın SendKeys.Send( "{HOME}+{END}" );.


Woofta! Bu biraz hackery! :-) Önerin için teşekkürler. Daha iyi bir fikrin var mı?
Judah Gabriel Himango

Gerçekten kesmek, ama bu hiç de kötü görünmüyor
Terry

3
Bir çok antivirüs programının müdahale ettiğini ve GÖNDERME ANAHTARLARINI kötü amaçlı olarak engellediğini düşünün. Harika bir çözüm değil.
Judah Gabriel Himango

4

Metin kutusunun tıklama etkinliği mi? Hatta MouseCaptureChanged etkinliği bile benim için çalışıyor. - TAMAM. çalışmıyor.

Yani 2 şey yapmanız gerekiyor:

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; 
}

Sekme için de çalışır (metin kutularından birine) - Enter durumunda AllAll () öğesini çağırın ...


Tamam Jakub, bu kısmen işe yarıyor. Metin kutusuna sekersem, odaklanması gerekir. Bu sizin çözümünüzle çalışır mı? (Bana nasıl olduğunu gösterebilirsen, cevabını doğru cevap olarak işaretleyeceğim.)
Judah Gabriel Himango

Jakub, şimdi kodu yayınladığına göre, bazen işe yarıyor gibi görünüyor . Her zaman değil; şu anda metin kutusunu tıklıyorum ve hepsini seçmiyor.
Judah Gabriel Himango

Bazen metne tıklarım ve hepsini seçmez. Bir şekilde .f alanı olması gerektiği gibi ayarlanmamıştır ve SelectAll çağrılmaz. Bunu görmedin mi?
Judah Gabriel Himango

Ben sadece mouseMouve çünkü fare hareket ederken (özellikle geniş harflerle) yavaş tıklayabilirsiniz biliyorum -> bayrağı unset. MouseMove olayında kodu kaldırabilirsiniz, ancak - daha sonra kontrol etmek için tabbgin sonra ve sonra tıklayın - reSelectAll - ilk sürükleme sırasında karıştırma parçası seçemiyorum
Jakub Kotrla

4

Kullandığım tek satırlık bir cevap ... kendinizi tekmeliyor olabilirsiniz ...

Etkinliğe Gir:

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


1
Hayır, çalışmıyor. Tüm metni seçer tamam, ancak kullanıcının diğer sorunların yanı sıra metnin sadece bir bölümünü seçmesini de engeller.
Judah Gabriel Himango

Üzgünüm, aradığınız davranışı yanlış anlamış olmalıyım. Enter tuşuna bastığınızda tümünü seçer, tıklayıp basılı tutarsanız imlecinizden başlayarak seçin. Sanırım sahip olduğum şeyi kullanabilir ve SelectAll'i kendi seçim mantığınızla değiştirebilirsiniz. notifywire.com/demos/2009-04-14_1248.swf

Harika çalışıyor! İlk tıklama kutuya girer; ardından metni seçmek için tıklayın ve sürükleyin.
D_Bester

Not: Web tarayıcısının adres çubuğu gibi çalışmaz. Bir web tarayıcısının adres çubuğu metin kutusunda fareyi aşağı kaydırmanıza ve metin kutusu henüz odağı olmasa bile sürükleyip / seçmenize olanak tanır. Bu çözüm bunu çözmez. Bu konuda sorun yoksa, serin, ancak bu sorunun gereksinimlerini karşılamıyor.
Judah Gabriel Himango

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

Tamam, burada denedikten sonra istediğiniz şey:

  • Enter etkinliğinde, enter etkinliğinde bulunduğunuzu bildiren bir bayrak başlatın
  • Click olayında, bayrağı ayarlarsanız, .SelectAll () öğesini arayın ve bayrağı sıfırlayın.
  • MouseMove olayında, girilen bayrağı false olarak ayarlayın, bu da önce metin kutusuna girmek zorunda kalmadan vurgulamayı tıklatmanızı sağlar.

Bu, girişteki tüm metni seçti, ancak daha sonra metnin bir kısmını vurgulamama veya ilk tıklamayı vurgulamanıza izin verdi.

Rica üzerine:

    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;
    }

Benim için, kontrole sekme tüm metni seçer.


Çözümünüz Jakub'un çözümüne benzer. Tıklama için çalışır. Metin kutusuna sekme yapılırken çalışabilir mi? (Örn. Tarayıcınızın adres çubuğuna
sekmek

Evet, sekme için de çalışır. Bir test uygulaması yazdım ve işte böyle çalıştım.
MagicKat

Sekme için çalışmıyor gibi görünüyor. Sekme için çalışan kodu gösterebilir misiniz?
Judah Gabriel Himango

3

İşte çözümü bir sonraki seviyeye taşıyan bir yardımcı fonksiyon - kalıtım olmadan tekrar kullanın.

    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();
            }   
        });
    }

Bunu kullanmak için bir TextBox geçen işlevi çağırmanız yeterlidir ve sizin için tüm dağınık bitlerle ilgilenir. Form_Load olayında tüm metin kutularınızı bağlamanızı öneririm. Bu işlevi formunuza veya benim gibi, daha fazla yeniden kullanmak için bir yardımcı program sınıfında bir yere yerleştirebilirsiniz.


2

Bu bir WPF / XAML TextBox için çalıştı.

    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

Bu nzhenry'nin popüler cevabına benzer , ancak alt sınıfa girmek zorunda kalmamayı daha kolay buluyorum:

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

Benim için hiç çalışmadı.

Bu çalışıyor.

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

Bu, metin kutusuna sekmenin odak getirdiği durumu hesaba katmaz. Ayrıca bu konuda tartışılan diğer bazı problemleri de sergilemektedir.
Judah Gabriel Himango

1

Daha da basit bir çözüm buldum:

Bir textBox'a tıklarken tüm metnin seçili olduğundan emin olmak için, Click işleyicisinin Enter işleyicisini çağırdığından emin olun. Ekstra değişkenlere gerek yok!

Misal:

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();
    }

Bu, kontrole sekme yoluyla odaklanmak için çalışmıyor, değil mi? Ayrıca, tümünü seçmeden bazı metinleri ne zaman seçmek istediğinize ne dersiniz?
Judah Gabriel Himango

Aslında, içine sekme ile çalışır! Ben sadece MS Visual C # 2010 kullanarak kukla bir projede test etti. Bu çözüm ile can sıkıcı bir şey, tüm seçmeden bazı metin seçemezsiniz. Sadece bunu yapmak istiyorsanız, elbette kod gerekmez, sadece farenizi kullanabilir ve (veya klavyeyi kullanarak) seçebilirsiniz.
Pieter Heemeryck

Bu yüzden bu çözüm sunulan sorunu çözmez: tarayıcı adres kutusu gibi davranmaz, çünkü tüm metni seçmeden adresin ayrı bölümlerini tıklayamazsınız.
Judah Gabriel Himango

Tamam, ne demek istediğini anlıyorum. Sorunun başlığı ve web tarayıcısının adres çubuğu örneği metnin bir kısmını seçebilmeniz gerektiğini göstermedi. Bunu sadece sorunuzun son cümlesinde bir taraf olarak söylediniz. Saygılarımızla.
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();
    }
}

Sadece bir RichTextBox ile test ettim. Çalışmıyor. Metin kutusuna tıklamak tüm metni seçmek için görünmez. (Çünkü fare imlecine yerleştirildiğinde, fare aşağı seçili olmadığından.)
Judah Gabriel Himango

0

İlginçtir, DropDownStyle = Simple ile bir ComboBox tam olarak aradığınız davranışa sahip olduğunu düşünüyorum.

(Denetimin yüksekliğini listeyi göstermeyecek şekilde azaltırsanız - ve sonra birkaç piksel daha fazla - ComboBox ile TextBox arasında etkili bir fark yoktur.)


İlginç, ama gerçekten TextBox ve RichTextBox üzerinde çalışmak için buna ihtiyacım var.
Judah Gabriel Himango

0

Neden metin kutusunun MouseDown Olayını kullanmıyorsunuz? Benim için iyi çalışıyor ve ek bir boole gerektirmiyor. Çok temiz ve basit, örn .:

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

Hayır, bununla ilgili birkaç sorun: metin kutusunun zaten odağı olup olmadığını hesaba katmıyor (her bir fareyi seçmek istiyoruz, sadece metin kutusunun odağı olmadığında), yalnızca metnin bir bölümü, metin kutusuna sekme yoluyla odak getirildiğinde çalışmaz.
Judah Gabriel Himango

0

MouseUp etkinliğinin içinde SelectAll'ı aradım ve benim için iyi çalıştı.

    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);
    }

Evet, bunun tüm senaryolarda neden işe yaramadığına dair diğer yanıtlara (ve yorumlara) bakın.
Judah Gabriel Himango

Bu çözüm için sekme kontrol etmedim. Benim hatam. İşaret ettiğiniz için teşekkürler. Şimdi tam bir çözüme sahip olduğunuzu gördüğüme sevindim. Ayrıca MouseUp için önerimin çözümünüze dahil olduğunu bilmekten memnuniyet duyuyorum.
Sreejith K.Eki

0

TextBox veya MaskedTextBox öğesinden bir sınıf türetmeniz yeterlidir:

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

Ve formlarınızda kullanın.


Bu işe yaramıyor. Nedenini anlamak için diğer cevaplara ve yorumlara bakın.
Judah Gabriel Himango


0

Aslında GotFocus, ilgilendiğiniz doğru olaydır (mesaj gerçekten), çünkü kontrole nasıl ulaşırsanız kazanın, eninde sonunda bunu alacaksınız. Soru, SelectAll () öğesini ne zaman aradığınızdır.

Bunu dene:

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();
    }
}

Ali, bu işe yaramıyor. Metnin ortasında fareyi deneyin. Fare düğmesini 1 saniye basılı tutun.
Judah Gabriel Himango

0

Formdaki bir grup metin kutusu için:

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
Bu düzgün çalışmıyor; .SelectAll () öneren diğer yanıtlara verdiğim yanıtlara bakın. Metin seçmeye çalışırken metin kutusuna girerseniz, tüm metni seçerek metin seçiminizi keser. Metni yalnızca odak, metin kutusuna fare yukarı veya sekme yoluyla girip girmişse, ancak odak fare aşağıdan kaynaklanmışsa seçmek istersiniz.
Yahuda Gabriel Himango

0

Bunun zaten çözülmüş olduğunu biliyorum ama aslında oldukça basit olduğunu düşündüğüm bir önerim var.

Mouse up etkinliğinde tek yapmanız gereken yer

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

VB.NET'te benim için çalışıyor gibi görünüyor (bunun bir C # sorusu olduğunu biliyorum ... ne yazık ki işimde VB kullanmak zorunda kaldım .. ve bu sorunu yaşıyordum, bu beni buraya getirdi ... )

Henüz bununla ilgili herhangi bir sorun bulamadım ... hemen tıklamaması dışında, ancak bununla ilgili sorunlar yaşıyordum ....


1
Orijinal istek, alana da sekmenizde bunun çalışmasını istedi.
Don Kirkby

2
Evet, bu tüm senaryolar için geçerli değil. Yalnızca metin kutusunu tıklattığınızda çalışır. Ve o zaman bile, bir tarayıcı adres çubuğu gibi davranmazsa, metin kutusunda seçim zaten olduğunda davranır.
Yahuda Gabriel Himango

0

Aşağıdaki çözüm benim için çalışıyor. TextBox metnini her zaman seçili tutmak için olayı ekledim OnKeyDownve OnKeyUpgeçersiz kıldım.

    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
Fareyi metin kutusuna götürmenize, bir metin seçmek için imlecinizi sürüklemenize ve ardından farenizi yukarı kaldırmanıza izin veriyor mu?
Judah Gabriel Himango

0

Kumandadan ayrılırken seçimi ayarlayın. Geri döndüğünüzde orada olacak. Formun çevresindeki sekme ve kontrole geri döndüğünüzde tüm metin seçilir.

Fareyle girerseniz, şapka doğru şekilde tıkladığınız noktaya yerleştirilir.

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

Fareyle girerseniz, odaklanmadıkça tüm metni seçmelidir. Bu bunu desteklemiyor.
Judah Gabriel Himango

0

Çok basit bir çözüm:

    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;
        }
    }

DÜZENLEME: Orijinal OP özellikle fare aşağı / metin seçimi / fare yukarı dizisi ile ilgiliydi, bu durumda yukarıdaki basit çözüm kısmen seçilen metinle sonuçlanacaktır.

Bu sorunu çözmelidir * (pratikte WM_SETCURSOR'u durduruyorum):

    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 );
    }

* Aslında aşağıdaki sıra kısmi metin seçimi ile sonuçlanır, ancak daha sonra fareyi metin kutusunun üzerine getirirseniz tüm metin tekrar seçilir:

fare-aşağı / metin seçimi / fare-dışarı-taşıma-metin kutusu / fare-up


Bu çözüm zaten gönderildi. Neden işe yaramadığını öğrenmek için mevcut cevabın yorumuna bakın.
Judah Gabriel Himango

sekme ve fare ile çalışır, odak alabilir, metin seçebilir ve daha sonra fare yapabilirsiniz. Bununla ilgili bir sorun bulamıyorum. Lütfen bunu gösterebilir misiniz?
Mauro Sampietro

0

Fare tıkladığında ve hemen bırakmadığında, bu işi en iyi buluyorum:

    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

Çözümüm oldukça ilkel ama amacım için iyi çalışıyor

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

Bir grup metin seçmek için farenizi aşağı kaydırmak, farenizi sürüklemek ve ardından fareyi yukarı kaydırmak istediğinizde çalışmaz. Kodunuz seçimi temizler ve her şeyi seçer.
Judah Gabriel Himango

@JudahHimango Jup. Eğer tek bir tıklama ile her şeyi seçecektir. Tıklayıp sürüklerseniz, yalnızca seçimi seçer. En azından Firefox'taki Tarayıcı çubuğu tam olarak bu davranışı gösteriyor.
BlueWizard

Yine de bu bir yarış durumu değil mi? Fare ile bazı metinleri hızlı bir şekilde seçmeyi başarırsam .SelectAll (), milisaniye sonra ateşler ve seçimimin üzerine yazar.
Judah Gabriel Himango

1
Tamam, bir şeyler seçme konusunda hızlıysanız, bu şey size karşı çalışacaktır.
BlueWizard

-1

Aşağıdaki işe yarıyor gibi görünüyor. Enter olayı, sekmeyi kontrole işler ve kontrol tıklandığında MouseDown çalışır.

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

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

Şansım yok, çalışmıyor Korkarım. Metin seçmeyi deneyin. .SelectAll metni kullanıcının seçmeye çalıştığı şeyin üzerine yazar.
Judah Gabriel Himango

-1

Cevap aslında yukarıdakilerin TÜMÜNDEN oldukça basit olabilir, örneğin (WPF'de):

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

Tabii bu kodu nasıl kullanmak istediğinizi bilemiyorum, ama burada bakmak için ana kısmı: İlk çağrı .Focus () ve sonra .SelectAll ();


Bu işe yaramaz ve diğer yanıtların bir kopyasıdır. Örneğin, metin kutusuna fareyi sürüklerseniz sürükleyin, metnin bir bölümünü seçmelidir. Bu onu kırıyor ve hepsini seçmiyor.
Judah Gabriel Himango

-1

enter ve click etkinliklerinde selectall () kullanın

private void textBox1_Enter(object sender, EventArgs e)
        {

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

Biraz metin seçmek isteyene kadar bu işe yarar. Tam açıklama için diğer cevaplara bakınız.
Judah Gabriel Himango

-1

Yeni bir VB.Net Wpf projesi oluşturdum. Bir TextBox oluşturdum ve codebehind için aşağıdakileri kullandım:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.