Код: Выделить всё
using Spectre.Console;
using System;
using System.IO;
using System.Text;
using System.Threading;
namespace DemoApp
{
class CreateFileDialog
{
private readonly string basePath;
public CreateFileDialog(string path)
{
basePath = path;
}
public string? ShowDialog()
{
AnsiConsole.Clear();
ShowTree();
var buffer = new StringBuilder();
int cursorPos = 0;
while (true)
{
if (!Console.KeyAvailable)
{
Thread.Sleep(30);
continue;
}
var key = Console.ReadKey(true);
switch (key.Key)
{
case ConsoleKey.Escape:
Console.CursorVisible = false;
return null;
case ConsoleKey.Enter:
if (buffer.Length == 0)
{
AnsiConsole.MarkupLine("[red]No file name entered![/]");
Console.ReadKey(true);
return null;
}
else
{
Console.CursorVisible = false;
return buffer.ToString().Trim();
}
case ConsoleKey.Backspace:
if (cursorPos > 0)
{
buffer.Remove(cursorPos - 1, 1);
cursorPos--;
}
break;
default:
if (!char.IsControl(key.KeyChar))
{
buffer.Insert(cursorPos, key.KeyChar);
cursorPos++;
}
break;
}
}
}
private void ShowTree()
{
try
{
var dirInfo = new DirectoryInfo(basePath);
if (!dirInfo.Exists)
{
AnsiConsole.MarkupLine($"[red]Directory does not exist:[/] {basePath}");
return;
}
var nodeStyle = new Style(
foreground: Color.White,
background: Color.DarkSlateGray1 // custom background color
);
var tree = new Tree(new Markup(dirInfo.Name, nodeStyle))
{
Guide = TreeGuide.Line,
Style = nodeStyle
};
var rootNode = tree.AddNode(new Markup(dirInfo.Name, nodeStyle));
AddDirectoryNodes(rootNode, dirInfo, nodeStyle);
AnsiConsole.Write(tree);
}
catch (Exception ex)
{
AnsiConsole.MarkupLine($"[red]Error building tree:[/] {ex.Message}");
}
}
private void AddDirectoryNodes(TreeNode node, DirectoryInfo dir, Style nodeStyle)
{
try
{
foreach (var subDir in dir.GetDirectories())
{
var child = node.AddNode(new Markup(subDir.Name, nodeStyle));
AddDirectoryNodes(child, subDir, nodeStyle);
}
foreach (var file in dir.GetFiles())
{
node.AddNode(new Markup(file.Name, nodeStyle));
}
}
catch (UnauthorizedAccessException)
{
node.AddNode(new Markup("Access denied", new Style(Color.Red, Color.Black)));
}
}
}
class Program
{
static void Main(string[] args)
{
string path = Directory.GetCurrentDirectory();
var dialog = new CreateFileDialog(path);
var result = dialog.ShowDialog();
if (result != null)
AnsiConsole.MarkupLine($"[green]Result:[/] {result}");
else
AnsiConsole.MarkupLine("[yellow]Aborted[/]");
}
}
}
Я строю небольшой демонстрационный проект с spectre.console , где я хочу отобразить дерево файлов внутри терминала. Ожидайте
Когда я запускаю программу, все консольное окно должно быть заполнено моим цветом фона (например, darkslategray1 ).
Дерево следует нарисовать на вершине. Консоль, фон должен продлиться соответствующим образом.
Таким образом, результат должен выглядеть как полноэккратный фон, с деревом, отображенным сверху - без черных пробелов.
что происходит сейчас
Только части консоли, где файл (и нарисованные, используются фона. Названия папок стилизованы правильно. Но все справа от текста остается черным. < /P>
Это приводит к противоречивому пользовательскому интерфейсу: стилизованный текст дерева, но фон по умолчанию везде.
Код: Выделить всё
PadRight- Пробое имена узлов набивших с пространствами, но это не работает достоверно с Spectre.console и не обрабатывает изменения размера. рендеринг
Написание markup (", style) через консольный буфер - работает частично, но часто перезаписывает/смешивает дерево. /> Это только влияет на простую консоль.write text, не spectre.console рендеринг.
До сих пор ни один из этих подходов не создал чистый, согласованный фон. Пример
См. Код выше. Запуск. Показывает проблему: само дерево стилизовано, но остальная часть консольного фона остается черной. /> В идеале решение должно: < /p>
Работать без вручную-погрузку каждым узлом. /> Я не получаю никаких ошибок < /p>
Подробнее здесь: https://stackoverflow.com/questions/797 ... he-appconf
Мобильная версия