2013-02-19 48 views
8

我想要一些提示在正確的方向,甚至準備好解決這個問題,我很卡住(我只是初學者/中級):如何在WPF中模擬控制檯?

我想實現一個SSH在我的應用程序。 SSH後端工作正常,但我堅持在前端。什麼WPF組合會給我提供一個足夠的解決方案來模擬一個控制檯?拋開一個完整的終端仿真,我很樂意簡單地將讀/寫線變成看起來像一個控制檯的東西:-)

我最好的方法還是一個80x50單個字符的網格導致4000單個單元格感覺就像一個過度的殺傷力。

另一個想法是做一個控制檯 - 應用程序。綁定到另一個項目中的wpf窗口。但是......這是甚至可能的,怎麼樣?

+9

沒有看起來更像......控制檯窗口控制檯窗口。 – 2013-02-19 01:16:00

+5

這可能會有所幫助,如果它會有幫助。請詳細說明一下。 – FrankyTheDumb 2013-02-19 01:41:35

+0

您可以設置ListBox的樣式並使用TextBoxes作爲項目,並使用上一個TextBox可編輯鍵入命令,然後輸入處理輸入的文本使TextBox只讀並向底部添加新的文本框 – 2013-02-19 01:45:00

回答

28

鑑於你想模擬控制檯,我會這樣做。請注意,您必須自己處理命令並輸出結果。

page.xaml

<Window x:Class="ConsoleEmulation.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" MinHeight="350" MinWidth="525" Height="350" Width="525"> 
    <Grid> 
     <ScrollViewer Name="Scroller" Margin="0" Background="Black"> 
      <StackPanel> 
       <ItemsControl ItemsSource="{Binding ConsoleOutput, Mode=OneWay}"> 
        <ItemsControl.ItemTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding Path=.}" Foreground="White" FontFamily="Consolas"/> 
         </DataTemplate> 
        </ItemsControl.ItemTemplate> 
       </ItemsControl> 
       <TextBox Text="{Binding ConsoleInput, Mode=TwoWay}" Background="Black" Foreground="White" FontFamily="Consolas" Name="InputBlock" BorderBrush="{x:Null}" SelectionBrush="{x:Null}" /> 
      </StackPanel> 
     </ScrollViewer> 
    </Grid> 
</Window> 

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<string> consoleOutput = new ObservableCollection<string>() { "Console Emulation Sample..." }; 

    public string ConsoleInput 
    { 
     get 
     { 
      return consoleInput; 
     } 
     set 
     { 
      consoleInput = value; 
      OnPropertyChanged("ConsoleInput"); 
     } 
    } 

    public ObservableCollection<string> 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)); 
    } 
} 
+0

這很漂亮!優秀!這就是我浪費了幾個小時的時間,並且很失敗:-)非常感謝! – FrankyTheDumb 2013-02-19 20:21:29

+0

我無法得到這個答案在ms visual studio中工作,並會欣賞構建/項目說明或如果需要,任何更正。 – user3461121 2018-02-05 02:48:47

3

您是否知道您可以使用AllocConsole從應用程序中顯示控制檯窗口?

這是一個簡單的方法來創建一個「雙模式」應用程序可以是一個 控制檯或Windows窗體應用程序。

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

或者您可以使用此:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition/> 
     <RowDefinition Height="30"/> 
    </Grid.RowDefinitions> 
    <TextBlock Text="Console contents..." HorizontalAlignment="Stretch" VerticalAlignment="Stretch" x:Name="ConsoleTextBlock"/> 
    <DockPanel Grid.Row="1"> 
     <TextBox/> 
    </DockPanel> 
</Grid> 

爲了獲得更好的外觀,具有ListBox和風格相應的ItemTemplate中更換的TextBlock。

+1

雖然這是非常可愛和簡單,它不是我真正想要的。我想要將控制檯放入wpf窗口(不單獨運行)或模擬控制檯本身。不過,非常感謝! – FrankyTheDumb 2013-02-19 20:19:58

+2

然後,我建議你看看這個:http://www.codeproject.com/Articles/247280/WPF-Command-Prompt – animaonline 2013-02-19 21:22:50

+0

它釘了它,謝謝你的鏈接! – FrankyTheDumb 2013-02-19 21:59:40

0

我沒有做我自己,但它是我的「如果我有我會做一個時間「-projects。 因此我仍然在尋找一個現有的實現:-P

不管怎麼說一些想法:

的applroach使用視覺效果(即橢圓的TextBlocks)可能不是一個好主意。 只要想想要發生什麼,如果你想像200x100字符。也許甚至是一個backbuffer。把它全部放在記憶中+畫出來......它會非常慢。

因此,更好的(或者甚至是正確的)方法是「畫自己」。由於WPF是反向緩衝的,並且你不想顯示任意位圖,所以最可能的方法是創建一個新的UserControl並覆蓋它的Paint-Method。 你可能喜歡從Control派生,但UserControl可能有內容,所以你可以在裏面顯示類似連接指示符的圖標。

體系結構明智我建議創建一個依賴屬性緩衝區ConsoleBuffer)持有控制檯緩衝區模型。另一個DP將保持左上位置位置long)。它決定了開始顯示的位置(當你看後面的時候)。控制檯模型我會做一個包含char[]Color[](一維)的類。使用換行符和\n字符來生成行(因爲這是控制檯的角色)。然後,如果調整控件大小,它將會重新流動,而不需要重新分配緩衝區。 您可以使用不同大小的** ConsoleBuffer **(對於不同數量的字符)。

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

也許建議持有數組陣列char[][]來代表行....但是這需要在編程時發現。

-3

根據我對你的問題的理解,你正在你的wpf應用程序中尋找一個控制檯。

要做到這一點去的性能應用輸出類型更改爲控制檯應用程序。

現在你可以很容易地使用控制檯作爲

//Input 
    string Input=Console.ReadLine(); 

//Output 
    Console.Write("something"); 
+0

我認爲你錯過了這一點。他要求在他的應用程序中有一個控制檯,而不是如何將他的應用程序「轉換」爲基於控制檯的應用程序 – SOReader 2017-05-05 18:32:01

相關問題