如何在WPF中模拟控制台?

我想要一些正确的方向,甚至是解决这个问题的方法,而且我很困难(我只是初学者/中级):

我正在尝试在我的应用程序中实现SSH。 SSH后端工作正常等,但我被困在前端。 WPF-Combination会给我一个足够的模拟控制台的解决方案吗? 抛开一个完整的终端仿真,我很乐意将readline / writeline简单地写成一个看起来像控制台的东西:-)

我最好的方法是80×50的单个字符网格,导致4000个单细胞,感觉就像一个完全矫枉过正。

另一个想法是制作一个控制台-Appl。 绑定到另一个项目中的wpf窗口。 但是……这是可能的,怎么样?

鉴于你想模仿一个控制台,我会这样做。 请注意,您必须自己处理命令并输出结果。

page.xaml

                

page.xaml.cs

 public partial class MainWindow : Window { ConsoleContent dc = new ConsoleContent(); public MainWindow() { InitializeComponent(); DataContext = dc; Loaded += MainWindow_Loaded; } void MainWindow_Loaded(object sender, RoutedEventArgs e) { InputBlock.KeyDown += InputBlock_KeyDown; InputBlock.Focus(); } void InputBlock_KeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Enter) { dc.ConsoleInput = InputBlock.Text; dc.RunCommand(); InputBlock.Focus(); Scroller.ScrollToBottom(); } } } public class ConsoleContent : INotifyPropertyChanged { string consoleInput = string.Empty; ObservableCollection consoleOutput = new ObservableCollection() { "Console Emulation Sample..." }; public string ConsoleInput { get { return consoleInput; } set { consoleInput = value; OnPropertyChanged("ConsoleInput"); } } public ObservableCollection ConsoleOutput { get { return consoleOutput; } set { consoleOutput = value; OnPropertyChanged("ConsoleOutput"); } } public void RunCommand() { ConsoleOutput.Add(ConsoleInput); // do your stuff here. ConsoleInput = String.Empty; } public event PropertyChangedEventHandler PropertyChanged; void OnPropertyChanged(string propertyName) { if (null != PropertyChanged) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } 

您是否知道可以使用AllocConsole从应用程序中显示控制台窗口?

这是一种创建“双模”应用程序的简单方法,可以是控制台或Windows窗体应用程序。

 [DllImport("kernel32")] static extern bool AllocConsole(); 

或者您可以使用此:

           

为了获得更好的外观,请使用ListBox替换TextBlock并相应地设置ItemTemplate的样式。

我自己没有这样做,但是如果我有时间的话,这是我的“我会做的” – 项目。 因此,我仍在寻找现有的实施方案:-P

无论如何一些想法:

使用Visuals(即Ellipses,Textblocks)的applroach可能不是一个好主意。 想想如果你想要200×100个字符会发生什么。 也许甚至是后退者。 将它全部保存在内存中+绘制它……它将非常慢。

因此,更好(甚至是正确)的方法是“吸引自己”。 由于WPF是后备缓冲的,并且您不想显示任意位图,因此最可能的方法是创建一个新的UserControl并覆盖它的Paint-Method。 您可能更喜欢从Control派生,但UserControl可能包含Content,因此您可以在其中显示类似连接指示符图标的内容。

建筑方面我建议创建一个ConsoleBuffer属性BufferConsoleBuffer )来保存控制台缓冲模型。 另一个DP将保持左上角位置long )。 它决定了在何处开始显示(当你看后面的时候)。 控制台模型我会创建一个包含char[]Color[] (一维)的类。 使用换行符和\n字符来创建行(因为这是控制台的字符)。 然后,如果您调整控件的大小,它将重新流动,而不需要重新分配缓冲区。 您可以使用不同大小的** ConsoleBuffer **(对于不同数量的外观字符)。

ConsoleBuffer.Write(string s)是你做东西的方法。

也许建议保持数组char[][]数组来表示行….但这要在编程时找出。