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[/]");
}
}
}
< /code>
Описание задачи
Я строю небольшой демонстрационный проект с spectre.console, где я хочу отобрать дерево файлов внутри терминала.
Моя цель состоит в том, что само древовидное изображение и весь фоновый фон консоли заполнен собственным цветом фона. Darkslategray1). < /P>
Дерево следует затем нарисовать поверх него. < /P>
Даже области справа от текста дерева должны иметь одинаковый цвет фона. Верх - без черных зазоров. < /p>
Что происходит сейчас
Только части консоли, где текст (узлы деревьев) рисуется. Используйте цвет фона. Текст, но по умолчанию везде. Консольный буфер - работает частично, но часто перезаписывает /смешивает дерево. Пример
См. Код выше. Запуск показывает проблему:
Само дерево стилизовано, но остальная часть консоли остается черной. /> Работа без вручную наносит вручную каждый узел.>
Подробнее здесь: https://stackoverflow.com/questions/797 ... he-appconf