2009-11-13 27 views
17

Sto tentando di visualizzare un suggerimento quando il mouse passa su un controllo disabilitato. Dal momento che un controllo disabilitato non gestisce alcun evento, devo farlo nella forma padre. Ho scelto di farlo gestendo l'evento MouseMove nel formato padre. Ecco il codice che fa il lavoro:Visualizzazione del suggerimento su un controllo disattivato

void Form1_MouseMove(object sender, MouseEventArgs e) 
    { 
     m_toolTips.SetToolTip(this, "testing tooltip on " + DateTime.Now.ToString()); 
     string tipText = this.m_toolTips.GetToolTip(this); 
     if ((tipText != null) && (tipText.Length > 0)) 
     { 
      Point clientLoc = this.PointToClient(Cursor.Position); 
      Control child = this.GetChildAtPoint(clientLoc); 
      if (child != null && child.Enabled == false) 
      { 
       m_toolTips.ToolTipTitle = "MouseHover On Disabled Control"; 
       m_toolTips.Show(tipText, this, 10000); 
      } 
      else 
      { 
       m_toolTips.ToolTipTitle = "MouseHover Triggerd"; 
       m_toolTips.Show(tipText, this, 3000); 
      } 
     } 
    } 

Il codice fa gestisce la visualizzazione tooltip per i disabili di controllo. Il problema è che quando il mouse passa sopra un controllo disabilitato, il suggerimento continua a chiudersi e a visualizzarlo di nuovo. Dal tempo di visualizzazione aggiunto nel suggerimento, quando il mouse si trova sopra il modulo principale, l'evento MouseMove viene chiamato all'incirca ogni 3 secondi, quindi la descrizione del comando viene aggiornata ogni 3 secondi. Ma quando il mouse si trova su un controllo disabilitato, il tooltip si aggiorna ogni 1 secondo. Inoltre, quando il tooltip si aggiorna sopra il modulo, solo il testo viene aggiornato con un breve flash. Ma quando il tooltip si aggiorna sopra un controllo disabilitato, la finestra del tooltip si chiude come se il mouse si stesse muovendo in un controllo abilitato e il tooltip doveva essere chiuso. ma poi il suggerimento ricompare subito.

Qualcuno può dirmi perché è questo? Grazie.

risposta

6

La risposta si è rivelata un po 'più semplice , ma doveva essere applicato in ogni momento.

void OrderSummaryDetails_MouseMove(object sender, MouseEventArgs e) 
{ 
     Control control = GetChildAtPoint(e.Location); 
     if (control != null) 
     { 
      string toolTipString = mFormTips.GetToolTip(control); 
      this.mFormTips.ShowAlways = true; 
      // trigger the tooltip with no delay and some basic positioning just to give you an idea 
      mFormTips.Show(toolTipString, control, control.Width/2, control.Height/2); 
     } 
} 
13

è possibile mostrare il suggerimento solo una volta quando il mouse colpisce il controllo disattivo e quindi lo nasconde quando il mouse lo abbandona. Pls, date un'occhiata al codice qui sotto, si dovrebbe mostrare un messaggio di suggerimento per tutti i controlli disabili sul modulo

private ToolTip  _toolTip = new ToolTip(); 
private Control  _currentToolTipControl = null; 

public Form1() 
{ 
    InitializeComponent(); 

    _toolTip.SetToolTip(this.button1, "My button1"); 
    _toolTip.SetToolTip(this.button2, "My button2"); 
    _toolTip.SetToolTip(this.textBox1, "My text box"); 
} 

private void Form1_MouseMove(object sender, MouseEventArgs e) 
{ 
    Control control = GetChildAtPoint(e.Location); 
    if (control != null) 
    { 
     if (!control.Enabled && _currentToolTipControl == null) 
     { 
      string toolTipString = _toolTip.GetToolTip(control); 
      // trigger the tooltip with no delay and some basic positioning just to give you an idea 
      _toolTip.Show(toolTipString, control, control.Width/2, control.Height/2); 
      _currentToolTipControl = control; 
     } 
    } 
    else 
    { 
     if (_currentToolTipControl != null) _toolTip.Hide(_currentToolTipControl); 
     _currentToolTipControl = null; 
    } 
} 

speranza che questo aiuti, riguarda

+0

Sembra quasi funzionare. Alcuni controlli si stanno comportando correttamente mentre altri stanno ancora lampeggiando. –

+2

Funziona meglio di DJ risposta per me. Ho aggiunto un controllo. Controllo visibile in modo da non far apparire suggerimenti sugli strumenti di controllo invisibili. Ho anche spostato il blocco di hide prima del blocco di show e controllato if (_currentToolTipControl! = Null && _currentToolTipControl! = Control) {... Hide(); _currentToolTipControl = null; } (senza questo, uno spostamento rapido a un altro controllo disabilitato non riesce ad aggiornare la descrizione). – mheyman

0

Ecco come ho risolto questo problema

Ho un'applicazione che genera automaticamente il codice per un PIC32MX.

L'applicazione ha 3 pagine di scheda testo = PWM, ADC e UART.

su ogni pagina Tab ho una casella di controllo text = RPA0

L'intenzione è, quando una periferica utilizza RPA0, l'altra periferica è impedito di utilizzare tali pin, disattivando su altre pagine, e un testo del tooltip deve apparire su nelle caselle di controllo disabilitate dicendo (esempio "Usato da PWM") quale periferica sta usando quel pin.

Il problema è che il testo del suggerimento non compare in una casella di controllo disabilitata.

Per risolvere il problema, ho appena rimosso il testo delle caselle di controllo e inserito le etichette con il testo che la casella di controllo dovrebbe avere.

Quando una casella di controllo è selezionata, le altre caselle di controllo sono disabilitate e l'etichetta accanto ad essa richiede un testo del suggerimento.

Quando l'etichetta è abilitata, viene visualizzato il testo del suggerimento, anche su una casella di controllo disabilitata.

Raddoppia il lavoro, metà della complessità.

ecco il codice e il designer per C# 2010

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 

     private void cb_ADC_RPA0_CheckedChanged(object sender, EventArgs e) 
     { 
      /* Disable pin on other peripherals */ 
      cb_UART_RPA0.Enabled = !((CheckBox)sender).Checked; 
      cb_PWM_RPA0.Enabled = !((CheckBox)sender).Checked; 

      SetTootTip((CheckBox)sender, lbl_PWM_RPA0, lbl_UART_RPA0, "ADC"); 

     } 



     private void cb_PWM_RPA0_CheckedChanged(object sender, EventArgs e) 
     { 
      /* Disable pin on other peripherals */ 
      cb_UART_RPA0.Enabled = !((CheckBox)sender).Checked; 
      cb_ADC_RPA0.Enabled = !((CheckBox)sender).Checked; 

      SetTootTip((CheckBox)sender, lbl_ADC_RPA0, lbl_UART_RPA0, "PWM"); 
     } 

     private void cb_UART_RPA0_CheckedChanged(object sender, EventArgs e) 
     { 
      /* Disable pin on other peripherals */ 
      cb_ADC_RPA0.Enabled = !((CheckBox)sender).Checked; 
      cb_PWM_RPA0.Enabled = !((CheckBox)sender).Checked; 
      SetTootTip((CheckBox)sender, lbl_ADC_RPA0, lbl_PWM_RPA0, "UART"); 

     } 

     void SetTootTip(CheckBox sender, Label lbl1, Label lbl2, string text) 
     { 
      /* Update tooltip on the other labels */ 
      if (sender.Checked) 
      { 
       toolTip1.SetToolTip(lbl1, "Used by " + text); 
       toolTip1.SetToolTip(lbl2, "Used by " + text); 
      } 
      else 
      { 
       toolTip1.SetToolTip(lbl1, ""); 
       toolTip1.SetToolTip(lbl2, ""); 
      } 
     } 
    } 
} 


namespace WindowsFormsApplication1 
{ 
    partial class Form1 
    { 
     /// <summary> 
     /// Required designer variable. 
     /// </summary> 
     private System.ComponentModel.IContainer components = null; 

     /// <summary> 
     /// Clean up any resources being used. 
     /// </summary> 
     /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 
     protected override void Dispose(bool disposing) 
     { 
      if (disposing && (components != null)) 
      { 
       components.Dispose(); 
      } 
      base.Dispose(disposing); 
     } 

     #region Windows Form Designer generated code 

     /// <summary> 
     /// Required method for Designer support - do not modify 
     /// the contents of this method with the code editor. 
     /// </summary> 
     private void InitializeComponent() 
     { 
      this.components = new System.ComponentModel.Container(); 
      this.tabControl1 = new System.Windows.Forms.TabControl(); 
      this.tpPWM = new System.Windows.Forms.TabPage(); 
      this.tpUART = new System.Windows.Forms.TabPage(); 
      this.tpADC = new System.Windows.Forms.TabPage(); 
      this.cb_PWM_RPA0 = new System.Windows.Forms.CheckBox(); 
      this.cb_ADC_RPA0 = new System.Windows.Forms.CheckBox(); 
      this.lbl_PWM_RPA0 = new System.Windows.Forms.Label(); 
      this.lbl_ADC_RPA0 = new System.Windows.Forms.Label(); 
      this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); 
      this.lbl_UART_RPA0 = new System.Windows.Forms.Label(); 
      this.cb_UART_RPA0 = new System.Windows.Forms.CheckBox(); 
      this.tabControl1.SuspendLayout(); 
      this.tpPWM.SuspendLayout(); 
      this.tpUART.SuspendLayout(); 
      this.tpADC.SuspendLayout(); 
      this.SuspendLayout(); 
      // 
      // tabControl1 
      // 
      this.tabControl1.Controls.Add(this.tpPWM); 
      this.tabControl1.Controls.Add(this.tpUART); 
      this.tabControl1.Controls.Add(this.tpADC); 
      this.tabControl1.Location = new System.Drawing.Point(12, 12); 
      this.tabControl1.Name = "tabControl1"; 
      this.tabControl1.SelectedIndex = 0; 
      this.tabControl1.Size = new System.Drawing.Size(629, 296); 
      this.tabControl1.TabIndex = 0; 
      // 
      // tpPWM 
      // 
      this.tpPWM.Controls.Add(this.lbl_PWM_RPA0); 
      this.tpPWM.Controls.Add(this.cb_PWM_RPA0); 
      this.tpPWM.Location = new System.Drawing.Point(4, 22); 
      this.tpPWM.Name = "tpPWM"; 
      this.tpPWM.Padding = new System.Windows.Forms.Padding(3); 
      this.tpPWM.Size = new System.Drawing.Size(621, 270); 
      this.tpPWM.TabIndex = 0; 
      this.tpPWM.Text = "PWM"; 
      this.tpPWM.UseVisualStyleBackColor = true; 
      // 
      // tpUART 
      // 
      this.tpUART.Controls.Add(this.cb_UART_RPA0); 
      this.tpUART.Controls.Add(this.lbl_UART_RPA0); 
      this.tpUART.Location = new System.Drawing.Point(4, 22); 
      this.tpUART.Name = "tpUART"; 
      this.tpUART.Padding = new System.Windows.Forms.Padding(3); 
      this.tpUART.Size = new System.Drawing.Size(621, 270); 
      this.tpUART.TabIndex = 1; 
      this.tpUART.Text = "UART"; 
      this.tpUART.UseVisualStyleBackColor = true; 
      // 
      // tpADC 
      // 
      this.tpADC.Controls.Add(this.lbl_ADC_RPA0); 
      this.tpADC.Controls.Add(this.cb_ADC_RPA0); 
      this.tpADC.Location = new System.Drawing.Point(4, 22); 
      this.tpADC.Name = "tpADC"; 
      this.tpADC.Padding = new System.Windows.Forms.Padding(3); 
      this.tpADC.Size = new System.Drawing.Size(621, 270); 
      this.tpADC.TabIndex = 2; 
      this.tpADC.Text = "ADC"; 
      this.tpADC.UseVisualStyleBackColor = true; 
      // 
      // cb_PWM_RPA0 
      // 
      this.cb_PWM_RPA0.AutoSize = true; 
      this.cb_PWM_RPA0.Location = new System.Drawing.Point(17, 65); 
      this.cb_PWM_RPA0.Name = "cb_PWM_RPA0"; 
      this.cb_PWM_RPA0.Size = new System.Drawing.Size(15, 14); 
      this.cb_PWM_RPA0.TabIndex = 0; 
      this.cb_PWM_RPA0.UseVisualStyleBackColor = true; 
      this.cb_PWM_RPA0.CheckedChanged += new System.EventHandler(this.cb_PWM_RPA0_CheckedChanged); 
      // 
      // cb_ADC_RPA0 
      // 
      this.cb_ADC_RPA0.AutoSize = true; 
      this.cb_ADC_RPA0.Location = new System.Drawing.Point(17, 65); 
      this.cb_ADC_RPA0.Name = "cb_ADC_RPA0"; 
      this.cb_ADC_RPA0.Size = new System.Drawing.Size(15, 14); 
      this.cb_ADC_RPA0.TabIndex = 1; 
      this.cb_ADC_RPA0.UseVisualStyleBackColor = true; 
      this.cb_ADC_RPA0.CheckedChanged += new System.EventHandler(this.cb_ADC_RPA0_CheckedChanged); 
      // 
      // lbl_PWM_RPA0 
      // 
      this.lbl_PWM_RPA0.AutoSize = true; 
      this.lbl_PWM_RPA0.Location = new System.Drawing.Point(38, 65); 
      this.lbl_PWM_RPA0.Name = "lbl_PWM_RPA0"; 
      this.lbl_PWM_RPA0.Size = new System.Drawing.Size(35, 13); 
      this.lbl_PWM_RPA0.TabIndex = 1; 
      this.lbl_PWM_RPA0.Text = "RPA0"; 
      // 
      // lbl_ADC_RPA0 
      // 
      this.lbl_ADC_RPA0.AutoSize = true; 
      this.lbl_ADC_RPA0.Location = new System.Drawing.Point(38, 66); 
      this.lbl_ADC_RPA0.Name = "lbl_ADC_RPA0"; 
      this.lbl_ADC_RPA0.Size = new System.Drawing.Size(35, 13); 
      this.lbl_ADC_RPA0.TabIndex = 2; 
      this.lbl_ADC_RPA0.Text = "RPA0"; 
      // 
      // lbl_UART_RPA0 
      // 
      this.lbl_UART_RPA0.AutoSize = true; 
      this.lbl_UART_RPA0.Location = new System.Drawing.Point(37, 65); 
      this.lbl_UART_RPA0.Name = "lbl_UART_RPA0"; 
      this.lbl_UART_RPA0.Size = new System.Drawing.Size(35, 13); 
      this.lbl_UART_RPA0.TabIndex = 4; 
      this.lbl_UART_RPA0.Text = "RPA0"; 
      // 
      // cb_UART_RPA0 
      // 
      this.cb_UART_RPA0.AutoSize = true; 
      this.cb_UART_RPA0.Location = new System.Drawing.Point(16, 65); 
      this.cb_UART_RPA0.Name = "cb_UART_RPA0"; 
      this.cb_UART_RPA0.Size = new System.Drawing.Size(15, 14); 
      this.cb_UART_RPA0.TabIndex = 5; 
      this.cb_UART_RPA0.UseVisualStyleBackColor = true; 
      this.cb_UART_RPA0.CheckedChanged += new System.EventHandler(this.cb_UART_RPA0_CheckedChanged); 
      // 
      // Form1 
      // 
      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
      this.ClientSize = new System.Drawing.Size(758, 429); 
      this.Controls.Add(this.tabControl1); 
      this.Name = "Form1"; 
      this.Text = "Form1"; 
      this.Load += new System.EventHandler(this.Form1_Load); 
      this.tabControl1.ResumeLayout(false); 
      this.tpPWM.ResumeLayout(false); 
      this.tpPWM.PerformLayout(); 
      this.tpUART.ResumeLayout(false); 
      this.tpUART.PerformLayout(); 
      this.tpADC.ResumeLayout(false); 
      this.tpADC.PerformLayout(); 
      this.ResumeLayout(false); 

     } 

     #endregion 

     private System.Windows.Forms.TabControl tabControl1; 
     private System.Windows.Forms.TabPage tpPWM; 
     private System.Windows.Forms.Label lbl_PWM_RPA0; 
     private System.Windows.Forms.CheckBox cb_PWM_RPA0; 
     private System.Windows.Forms.TabPage tpUART; 
     private System.Windows.Forms.TabPage tpADC; 
     private System.Windows.Forms.Label lbl_ADC_RPA0; 
     private System.Windows.Forms.CheckBox cb_ADC_RPA0; 
     private System.Windows.Forms.ToolTip toolTip1; 
     private System.Windows.Forms.CheckBox cb_UART_RPA0; 
     private System.Windows.Forms.Label lbl_UART_RPA0; 
    } 
} 
2

ho provato molti ma finito per usare questo semplice trucco che penso che sia più efficace.

Creare una sottoclasse (CustomControl con controllo solo base in esso) che si estende UserControl

poi invece di impostare "Abilitato" proprietà su false creare un metodo che disabilita solo basecontrol in questo invece dell'intero CustomControl.

Impostare il suggerimento su CustomControl sarà ancora in grado di sparare ai gestori di eventi che impostano il controllo di base disabilitato. Funziona ovunque sia utilizzato CustomControl piuttosto che la codifica su ogni modulo utilizzato.

Ecco il suggerimento .. :)

public partial class MyTextBox : UserControl 
{ 
    ... 
    ... 
    ... 


    public void DisableMyTextBox() 
    { 
     this.txt.Enabled = false; //txt is the name of Winform-Textbox from my designer 
     this.Enabled = true; 
    } 

    public void EnableMyTextBox() 
    { 
     this.txt.Enabled = true; 
     this.Enabled = true; 
    } 

    //set the tooltip from properties tab in designer or wherever 
} 
0

Ho creato un nuovo UserControl che contiene solo un pulsante.

public partial class TooltipButton : UserControl 
{ 
    public TooltipButton() 
    { 
     InitializeComponent(); 
    } 

    public new bool Enabled 
    { 
     get { return button.Enabled; } 
     set { button.Enabled = value; } 
    } 

    [Category("Appearance")] 
    [Description("The text displayed by the button.")] 
    [EditorBrowsable(EditorBrowsableState.Always)] 
    [Browsable(true)] 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
    [Bindable(true)] 
    public override string Text 
    { 
     get { return button.Text; } 
     set { button.Text = value; } 
    } 

    [Category("Action")] 
    [Description("Occurs when the button is clicked.")] 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
    public new event EventHandler Click; 

    private void button_Click(object sender, EventArgs e) 
    { 
     // Bubble event up to parent 
     Click?.Invoke(this, e); 
    } 
} 
Problemi correlati