Предисловие
Некоторое время назад мне понадобилось написать некое консольное приложение для собственных нужд. Но так как это было бы слишком просто, было решено прикрутить к нему некое подобие GUI.
Блуждая на просторах интернета, мне удалось найти только две библиотеки для .NET, которые, возможно, удовлетворили бы мои потребности: MonoCurses и CursesSharp. Но эти библиотеки целиком и полностью заточены под ncurses — *nix-библиотеку для управления терминалом, и с Windows если и вообще совместимы, то очень плохо. В итоге возникло единственное решение написать свой велосипед.
Функционал
Кроссплатформенность
GoddamnConsole полностью совместим и с Windows (используется WinAPI), и с Linux (используется ncurses), и, возможно, даже с другими Unix-подобными ОС (Mac OS X, FreeBSD).
Весь функционал библиотеки одинаково работает на обеих операционных системах. Кроме того, поддержку ОС можно расширить путем написания консольного провайдера (если на этой ОС можно запустить .NET, конечно).
Визуальные компоненты
Компонент — основная единица UI библиотеки. Для написания своего компонента достаточно просто создать наследника класса Control и переопределить пару методов (отрисовка, события клавиатуры). Также доступно несколько встроенных компонентов:
— TabControl — компонент, использующийся для создания вкладок. Переключение вкладок происходит по нажатию на стрелку вправо и влево.
— TextView — компонент для отображения текста.
StackPanel — простейший контейнер, укладывает дочерние элементы в столбец или строку.
Кстати, это пример компонента, у которого даже не переопределен метод отрисовки — т.е. сам он ничего не рисует.
— Grid — контейнер, представляющий собой сетку элементов. Очень похож на одноименный компонент из WPF.
GridWindow дублирует функциональность этого контейнера, за исключением того, что GridWindow самостоятелен, а Grid — нет.
— TextBox — компонент для отображения и ввода текста. В отличие от TextView, захватывает фокус и поддерживает скроллинг.
— Button — кнопка. Имеет событие Clicked, вызывающееся при нажатии на Enter.
Независимость от размера консоли
Независимость от размера консоли — очень важный элемент консольного (да и вообще любого) UI, так как терминалы *nix поддерживают свободное изменение своего размера. А с недавних пор такая возможность была добавлена и в Windows 10.
Как это использовать?
Для использования библиотеки вам достаточно скачать последний релиз библиотеки из репозитория GitHub и добавить ссылку в проект на нее. Кроме того, вы можете скачать исходники и самостоятельно скомпилировать их. В случае Linux с компиляцией могут возникнуть проблемы из-за того, что xbuild не умеет собирать проекты .NET 4.5. Вам потребуется либо собрать библиотеку вручную (инструкция будет позже), либо воспользоваться компьютером с Windows.
Простой пример использования:
using GoddamnConsole.Controls;
using Console = GoddamnConsole.Console;
namespace GoddamnConsoleSample
{
internal class Program
{
private static void Main()
{
var window = new ContentWindow(); // создание окна
window.Title = "Sample Window"; // установка заголовка окна
var text = new TextView(); // создание текстового поля
text.Text = "Hello, World!";
window.Content = text; // установка содержимого окна
Console.Windows.Add(window); // добавление окна в консоль
Console.Start(); // запуск консоли
}
}
}
Результат:
Кроме того, в репозитории вы можете найти пример, который охватывает практически всю текущую функциональность.
Заключение
Библиотека еще готова полностью, но она вполне пригодна для построения простых (и не только) приложений.
Некоторая функциональность в статье не описана (например, Data Binding) в следствие ее недостаточной завершенности. В дальнейшем планируется добавить больше компонентов, добавить новую функциональность и отладить существующую.
С удовольствием отвечу на все вопросы в комментариях, если возникнут.
Отдельное спасибо сайту govnokod.ru за помощь в костылировании под линукс.
Ссылки
Автор: zawodskoj