2013-01-03 13 views
6

Ho un'applicazione C# WinForms abbastanza grande (larghezza) che utilizza uno System.Windows.Forms.Label all'interno di un riquadro di selezione.Etichetta che scompare inavvertitamente dopo una certa lunghezza

A System.Timers.Timer aggiorna la posizione Label dopo un evento di spunta.

int new_X_location = (label.Location.X + distance_invariant) % modulo; 
label.Location = new Point(new_X_location, label.Location.Y); 

La funzionalità del tendone non è il problema, quando cambio campo Label.Text, l'etichetta scompare!

string some_string = working_function_that_returns_string(); 
label.Text = some_string; //disappears! 

enter image description here

Sembra essere limitata ad una lunghezza di circa 2100 caratteri o così quando la dimensione del carattere è grande (24pt). Quando è più piccolo (10pt) la stringa può essere molto più lunga (label.Text.Length >= 4200).

string some_string = working_function_that_returns_string(); 
label.Text = some_string.SubString(0,2000); //it's still visibile here. 
... 
label.Text = some_string.SubString(0,2200) //it's not visible! 

Non so se ha a che fare con le limitazioni di larghezza o limiti di dimensione dei caratteri o un posizionamento larghezza di modulo. . Il posizionamento è corretto con caratteri di dimensioni minori e stringhe più corte. Pertanto non si tratta di un errore di posizionamento.

+1

La prego di inviare il codice e/o foto del tuo problema rilevante? – 3aw5TZetdf

+2

Non usare mai System.Timers.Timer per fare qualsiasi cosa con un controllo. Impostare la proprietà CheckForIllegalCrossThreadCalls su true. –

+0

Mi sto prendendo cura di questo con 'InvokeRequired' e' .Invoke() 'grazie. Non ci sono problemi al riguardo. –

risposta

0

Hai provato ad avere un'etichetta di dimensioni fisse (AutoSize false) con la proprietà AutoEllipsis true? Se è dovuto a limiti di larghezza o problemi di avvolgimento, dovrebbe andare via.

Se ciò non risolve il problema, è consigliabile esaminare il codice di posizionamento. Se sta usando la larghezza dell'etichetta nel calcolo della posizione, la larghezza cambia a causa del cambio di testo potrebbe generare sorprese in alcuni casi d'angolo. Anche in questo caso, potrebbe essere utile disporre di un'etichetta di dimensioni fisse (o con dimensioni massime).

+0

In realtà mi piacerebbe l'esatto contrario, ('AutoSize = true',' AutoEllipsis = false'). Ho provato quello che hai detto e il testo non scompare, ma sembra molto breve dato che non ridimensiona. ciò sembrerebbe significare che il posizionamento è ok. –

+1

@ user1934851, qual è il valore della dimensione dell'etichetta nel testo più lungo? Determina la soglia (della dimensione dell'etichetta o della dimensione del testo) e passa a 'AutoSize = false, AutoEllipsis = true'. Un altro modo sarebbe consentire l'avvolgimento del testo aumentando l'altezza, ma è più noioso dell'opzione precedente. – VinayC

+0

Anche se rimuovo l'evento tick, rendendo l'etichetta stazionaria, il problema rimane. Puoi per favore essere più specifico su "text-wrapping aumentando l'altezza"? –

0

Sto anche usando qualcosa del genere! Prova questo:

label1.Size = CreateGraphics().MeasureString(label_txt, label1.Font).ToSize(); 
0

è possibile utilizzare i punti di interruzione per tale funzione.

(brkpnt)| string some_string = working_function_that_returns_string(); 

quindi durante il debug "passo" quella funzione. esegui il debug passo dopo passo. controlla le variabili dalle finestre di auto. potrebbe avere un ERRORE LOGICO che restituisce "" una stringa vuota.

devi postare che working_function_that_returns_string();

altro İdea. è possibile modificare textbox.bacgorundcolor a nessuno di far sembrare che l'etichetta

0

Il mio tentativo di risolvere l'errore:

// Try disabling the "AutoSize"-property, and use the panels' sizes 
label.AutoSize = false; 
label.Width = yourRedPanel.Width; 
label.Height = yourRedPanel.Height; 
label.TextAlign = ContentAlignment.MiddleLeft; 
label.AutoEllipsis = true; 

// Check that "new_X_location"-variable is not negative or 
// too big to move the label out of the viewable area 
label.Location = new System.Drawing.Point(new_X_location, label.Location.Y); 

// Check that some_string.Length is as great or greater than given Substring length argument 
label.Text = some_string.Substring(0, 2200); 

// The max font size is the biggest possible value of float 
Font testFont = new Font("Arial", float.MaxValue); 

// If this doesn't help, wrap your code to try-catch block 
// Run the code line by line (F10), and see where it jumps to "catch", 
// if there occurs errors 
try 
{ 
    // Code here 
} 
catch (Exception ex) { MessageBox.Show(ex.Message); } 
1

Ho creato un'applicazione di test per controllare e penso che il problema è legato alla uso di GDI+ e l'accelerazione hardware utilizzata da questa libreria. Sul mio PC una larghezza superiore a 8192 pixel non viene visualizzata correttamente (l'etichetta scompare come nel tuo caso quando cambio testo).

impostazione della proprietà UseCompatibleTextRendering dell'etichetta (e quindi usando GDI e non GDI+) il testo renda quasi correttamente, ma alcuni frammenti glifi sono visibile sul lato inferiore dell'etichetta.

È necessario rompere l'etichetta in diverse etichette:

  • cercare di rompere l'etichetta nel chuncks non superiori a 8192 pixel.
  • se il testo è composto da vari periodi, è possibile creare un'etichetta per ciascun periodo (è più veloce e più semplice).

Questo è il codice di prova:

using System; 
using System.Drawing; 
using System.Windows.Forms; 

namespace LabelMaxChars 
{ 
    public partial class Form1 : Form 
    { 
     private Panel pnlStrip; 
     private Label lblText; 
     private Timer timer; 

     public Form1() 
     { 
      InitializeComponent(); 

      pnlStrip = new Panel(); 
      pnlStrip.Dock = DockStyle.Top; 
      pnlStrip.Height = 64; 
      pnlStrip.BackColor = SystemColors.ActiveCaption; 
      pnlStrip.ForeColor = Color.White; 

      lblText = new Label(); 
      lblText.Font = new Font("Microsoft Sans Serif", 12.0f, FontStyle.Regular, 
            GraphicsUnit.Point, ((byte)(0))); 
      lblText.Location = new Point(582, 6); 
      lblText.AutoSize = true; 
      lblText.UseCompatibleTextRendering = true; 
      lblText.Text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. "+ 
          "Sed vestibulum elit ac nunc feugiat, non varius enim commodo. "+ 
          "Etiam congue, massa sollicitudin congue dapibus, odio erat blandit "+ 
          "lectus, non vehicula nisi lacus sed orci. Vestibulum ante ipsum primis "+ 
          "in faucibus orci luctus et ultrices posuere cubilia Curae; Donec ullamcorper "+ 
          "feugiat dui, at imperdiet elit pulvinar in. Sed ac fermentum massa. "+ 
          "Mauris hendrerit magna sit amet mi eleifend fringilla. "+ 
          "Donec pretium augue gravida enim fermentum placerat. "+ 
          "Vestibulum malesuada nisl a odio imperdiet condimentum. Sed vitae neque nulla. "+ 
          "Curabitur sed facilisis odio. Integer adipiscing, ante ac cursus dignissim, "+ 
          "ante sapien auctor ligula, id faucibus elit mauris nec nulla. "+ 
          "Sed elementum nisl id quam convallis dictum. Nullam nulla turpis, "+ 
          "elementum ac nisi in, faucibus eleifend est. "; 

      lblText.Text += lblText.Text; 
      lblText.Text += lblText.Text; 
      lblText.Text += lblText.Text; 
      lblText.Text += lblText.Text; 

      Console.WriteLine("Text length {0}", lblText.Text.Length); 

      pnlStrip.Controls.Add(lblText); 
      this.Controls.Add(pnlStrip); 

      timer = new Timer(); 
      timer.Interval = 10; 
      timer.Enabled = true; 
      timer.Tick += new EventHandler(timer_Tick); 
     } 

     private void timer_Tick(object sender, EventArgs e) 
     { 
      --lblText.Left; 
      if (lblText.Left == this.ClientSize.Width >> 1) 
      { 
       lblText.Text = "Nullam id nisl tortor. Donec in commodo magna. Integer dignissim vestibulum ipsum, " + 
       "ac lobortis nisl faucibus ac. Pellentesque convallis placerat est, " + 
       "non tempus mi scelerisque in. Sed vel aliquam tellus. " + 
       "Donec tincidunt elit et imperdiet egestas. Cras vel dictum lacus. " + 
       "Nullam mollis neque ac lectus congue, eget imperdiet risus feugiat. " + 
       "In commodo odio quis purus scelerisque, ut vestibulum justo vulputate. " + 
       "Proin sit amet facilisis libero. Donec mollis, enim at ultrices rhoncus, " + 
       "quam lectus condimentum ante, a varius urna nisl rutrum mi. " + 
       "Pellentesque sodales tincidunt suscipit. Cras semper sem vulputate, " + 
       "ornare eros sed, fringilla libero. Sed risus turpis, mollis vitae dictum eu, " + 
       "malesuada et magna. Etiam quis orci nunc. Morbi mattis ante a nibh hendrerit vehicula. "; 

       lblText.Text += lblText.Text; 
       lblText.Text += lblText.Text; 
       lblText.Text += lblText.Text; 
       lblText.Text += lblText.Text; 

       Console.WriteLine("Text length {0}", lblText.Text.Length); 
      } 

     } 
    } 
} 
Problemi correlati