Pertanyaan Bagaimana saya bisa menampilkan tooltip pada tombol yang dinonaktifkan?


Jika Anda memiliki tombol yang dinonaktifkan pada winform bagaimana Anda bisa menunjukkan tip-alat di mouse-over untuk menginformasikan pengguna mengapa tombol dinonaktifkan?


32
2018-01-29 11:26


asal


Jawaban:


Sam Mackrill, terima kasih atas jawaban Anda, ide bagus untuk menggunakan Tag untuk mengetahui Kontrol apa yang Anda tinggalkan. Namun Anda masih membutuhkan bendera IsShown sesuai jawaban BobbyShaftoe. Jika Anda memiliki mouse di tempat yang salah, jika ToolTip muncul di bawahnya, itu dapat memicu event MouseMove lain (meskipun Anda tidak menggerakkan mouse secara fisik). Ini dapat menyebabkan beberapa animasi yang tidak diinginkan, karena tooltip terus menghilang dan muncul kembali.

Ini kode saya:

    private bool toolTipShown = false;
    private void TimeWorks_MouseMove(object sender, MouseEventArgs e)
    {
        var parent = sender as Control;
        if (parent == null)
        {
            return;
        }
        var ctrl = parent.GetChildAtPoint(e.Location);
        if (ctrl != null)
        {
            if (ctrl.Visible && toolTip1.Tag == null)
            {
                if (!toolTipShown)
                {
                    var tipstring = toolTip1.GetToolTip(ctrl);
                    toolTip1.Show(tipstring.Trim(), ctrl, ctrl.Width / 2, ctrl.Height / 2);
                    toolTip1.Tag = ctrl;
                    toolTipShown = true;
                }
            }
        }
        else
        {
            ctrl = toolTip1.Tag as Control;
            if (ctrl != null)
            {
                toolTip1.Hide(ctrl);
                toolTip1.Tag = null;
                toolTipShown = false;
            }
        }
    }

8
2018-04-12 05:08



Sejak itu saya telah mengadaptasi jawaban BobbyShaftoe menjadi sedikit lebih umum

Catatan:

  • Peristiwa MouseMove harus diatur pada kontrol orangtua (panel dalam kasus saya)

    private void TimeWorks_MouseMove(object sender, MouseEventArgs e)
    {
        var parent = sender as Control;
        if (parent==null)
        {
            return;
        }
        var ctrl = parent.GetChildAtPoint(e.Location);
        if (ctrl != null && !ctrl.Enabled)
        {
            if (ctrl.Visible && toolTip1.Tag==null)
            {
                var tipstring = toolTip1.GetToolTip(ctrl);
                toolTip1.Show(tipstring, ctrl, ctrl.Width / 2, ctrl.Height / 2);
                toolTip1.Tag = ctrl;
            }
        }
        else
        {
            ctrl = toolTip1.Tag as Control;
            if (ctrl != null)
            {
                toolTip1.Hide(ctrl);
                toolTip1.Tag = null;
            }
        }
    
    }
    

10
2018-01-29 12:58



Jadi dengan asumsi kontrol Anda disebut "button1" Anda bisa melakukan sesuatu seperti ini. Anda harus melakukannya dengan menangani acara MouseMove dari formulir Anda karena acara tidak akan diaktifkan dari kontrol Anda.

bool IsShown = false;      

        void Form1_MouseMove(object sender, MouseEventArgs e)
        {
           Control ctrl = this.GetChildAtPoint(e.Location);

           if (ctrl != null)
           {
               if (ctrl == this.button1 && !IsShown)
               {
                   string tipstring =
this.toolTip1.GetToolTip(this.button1);                 
                   this.toolTip1.Show(tipstring, this.button1,
this.button1.Width /2, this.button1.Height / 2);
                   IsShown = true;
               }
           }
           else
           {
               this.toolTip1.Hide(this.button1);
               IsShown = false;
           }
        }

8
2018-01-29 11:33



Tempatkan tombol (atau kontrol apa pun yang sesuai dengan skenario ini) dalam sebuah wadah (panel, tableLayoutPanel), dan kaitkan tooltip ke sel panel dasar yang sesuai. Bekerja dengan baik dalam sejumlah skenario, fleksibel. Kiat: buat sel cukup besar untuk menahan bttn, sehingga respons gerakan mouse (tampilan keterangan alat) tidak tampak "berdarah" di luar batas bttn.


8
2017-07-19 22:25