Je veux savoir s'il est possible en C # d'empêcher la console de créer de nouvelles lignes à partir de longues chaînes et de masquer plutôt simplement le texte qui dépasse la largeur de la fenêtre.
Par exemple, lorsque je crée de longues chaînes, le résultat serait le suivant:
Blah blah blah, word stuff, word stuff, bl | <-- Window width
ah blah blah. | <-- Window width
Je veux que ce soit comme ça:
Blah blah blah, word stuff, word stuff, bl | <-- Window width
| <-- Window width
3 réponses
Vous pouvez le faire en interceptant la sortie standard Console
.
Le code ci-dessous est juste pour vous aider à démarrer. Si vous avez besoin de prendre en charge les tabulations, le positionnement aléatoire du curseur, des mélanges de fins de ligne (par exemple \ r \ n et \ n et \ r), alors cela peut nécessiter plus de travail.
ConsoleTruncator
vous permet de définir la "maxlinelength" qui contrôle le nombre maximum de caractères sur chaque ligne - cela n'arrête pas le wrapping si la largeur de la fenêtre de la console a été réduite au-dessous de cette valeur "maxlinelength".
Donc à la place, vous pouvez utiliser quelque chose comme ceci pour "suivre" la largeur de la console (bien proche de):
bool bRoom = (Console.WindowWidth - 1 - m_columnposition) > 0;
Pour de simples Write
, et WriteLines
, je pense que ça devrait aller.
Une manière plus avancée de le faire serait de capturer toute la sortie de la console, de mettre en mémoire tampon et de suivre tout cela, puis de la réécrire en utilisant Console.SetCursorPosition
et Console.Write
.
using System;
using System.IO;
using System.Text;
namespace ConsoleApp5
{
public class ConsoleTruncator : TextWriter
{
TextWriter m_console;
int m_maxlinelength;
int m_columnposition;
public ConsoleTruncator(int maxlinelength)
{
m_maxlinelength = maxlinelength;
m_console = Console.Out; // save console stream reference between we replace it
Console.SetOut(this); // redirect console to this TextWriter
// (don't do the `SetOut` here ... you need to separate out the
// the attach and detach of the custom `TextWriter` to the
// console into some other utility class/helper...for good structure)
}
public override Encoding Encoding
{
get
{
return Encoding.UTF8;
}
}
public override void Write(char value)
{
if (value == '\r')
return;
if (value == '\n')
{
OutputChar(value);
m_columnposition = 0;
}
else
{
bool bRoom = (m_maxlinelength - m_columnposition) > 0;
if (bRoom)
{
OutputChar(value);
m_columnposition++;
}
}
}
private void OutputChar(char value)
{
m_console.Write(value);
}
}
class Program
{
static void Main(string[] args)
{
string[] somelines =
{
"AAALorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam auctor neque quis euismod auctor. Fusce massa nibh, fringilla eu mi ornare, ullamcorper tristique nibh. Aenean eget neque111",
"BBBxxxxxxxx vvvvvvvvvvvvvvvvvvv xxxxxxxxxxxxxxxxx222",
"CCCNullam porta eu magna eget rutrum. Aenean orci urna, pretium ut odio vitae, euismod rhoncus ligula. Vivamus condimentum semper lacus id tempor. Phasellus at turpis a quam ornare tincidunt. Vivamus eleifend quam eget velit porttitor, sit amet laoreet risus consectetur. Mauris eu arcu sit amet ipsum vulputate porttitor. Phasellus elementum erat eu blandit semper. Integer eu metus urna. Pellentesque at posuere purus. Nu333",
"0123456789 0123456789 0123456789 0123456789 0123456789 0123456789\r\n0123456789+*+*+*+*+*0123456789+*+*+*+*+*0123456789",
"abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz\r\n\r\nABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ"
};
using (var consoleTruncator = new ConsoleTruncator(40))
{
foreach(string s in somelines)
{
Console.WriteLine(s);
}
Console.WriteLine();
Console.Write("write a bit");
Console.Write("-write a bit more");
Console.Write("-write too muchhhhhhhhhhhhhhhh");
}
Console.ReadKey();
}
}
}
Vous pouvez le faire en ajustant la largeur de la taille du tampon d'écran de la fenêtre de la console:
Pour l'ajuster par programme, vous pouvez appeler:
//Any value greater than 80:
Console.BufferWidth = 120;
Le meilleur moyen est d'utiliser buffsize, comme ceci:
int windowWidth = Console.WindowWidth;
string str = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
Console.Write(str.ToCharArray(), 0, windowWidth);
Une autre façon est le bricolage. C'est un peu difficile à faire, mais vous pouvez le faire en suivant les étapes suivantes: 1. Obtenir la taille actuelle de la fenêtre
int windowWidth = Console.WindowWidth;
2. Obtenez la longueur d'affichage de la chaîne actuelle, elle est liée à votre police
Font font = new Font(FontFamily.GenericSansSerif, 11);
var size = TextRenderer.MeasureText(str, font).Width;
3. Utilisez les 2 valeurs pour couper la corde et afficher la 1ère partie.
Mais c'est très compliqué.
De nouvelles questions
c#
C # (prononcé "see sharp") est un langage de programmation multi-paradigme de haut niveau, typé statiquement développé par Microsoft. Le code C # cible généralement la famille d'outils et d'exécutions Microsoft .NET, notamment le .NET Framework, .NET Core et Xamarin. Utilisez cette balise pour les questions sur le code écrit en C # ou en spécification formelle de C #.