首先,免责声明,您将要见证的是我近20年的第一次编码。我是C#和WPF的新手,试图让我的头脑WPF不仅仅是一个挑战。
在过去的一个月里,我一直在研究一个表现良好的宠物项目控制台应用程序。我现在正试图通过在项目中添加一个现代GUI来进一步推进它。
我想通过在WPF窗口中使用包装在滚动条内的WPF文本块来模拟控制台(只是基本的outpu功能)。您可以see the original console application in action here更好地了解我正在尝试模拟的控制台输出类型。但是我遇到了基本函数调用的一个主要问题,我认为这是因为我不完全理解WPF / C#是如何工作的。
应用程序通过Main()启动代码,如下所示:
class Program
{
public static ConsoleWindow MainConsole = new ConsoleWindow();
[STAThread]
static void Main(string[] args)
{
Application MyApplication = new Application();
MyApplication.Run(MainConsole);
// The following code does not work, it produces no output in the Textblock
MainConsole.WriteLine("Crystal Console");
MainConsole.WriteLine("Version: " + Properties.Settings.Default.BuildVersion);
MainConsole.WriteLine("Current Time: " + DateTime.Now);
MainConsole.WriteLine("Last Login: " + Properties.Settings.Default.dateLastLogin);
}
}
问题是所调用的方法似乎对文本块的内容没有任何影响。
虽然我打算在需要的时候提供大量信息,但问题本身很简单:为什么在同一个窗口从文本框控件中获取内容时Textblock更新正常,但是在Main()中调用相同方法时显示任何更新?
出于测试目的,该窗口有几个文本框,可以在窗口内调用.WriteLine方法,这样可以工作,所以我知道.WriteLine代码没有问题,你可以在这里看到:
public void WriteLine(string Message = null, string Sender = null)
{
_Console.AddElement(new ConsoleElement(Sender, Message + "\n"));
_Console.DisplayContent(ConsoleTextBlock);
ConsoleScroller.ScrollToEnd();
}
以下是控制台本身的代码(如果需要),“ConsoleElement”类本质上只是一个对象,其中包含要在Textblock中显示的消息以及每个消息的格式。
class ConsoleStream
{
IList<ConsoleElement> ConsoleElements = new List<ConsoleElement>();
public void AddElement(ConsoleElement NewElement)
{
if (NewElement.Sender == null) // Sender is System not user.
{
NewElement.Content = " " + NewElement.Content;
NewElement.Font = new FontFamily("Arial");
NewElement.FontSize = 12;
}
ConsoleElements.Add(NewElement);
}
public void ClearElements()
{
ConsoleElements.Clear();
}
public void DisplayContent(TextBlock sender)
{
sender.Text = null;
foreach (ConsoleElement Message in ConsoleElements)
{
//If message is a status update, i.e. has no sender, format it as a system message.
if (Message.Sender != null)
{
sender.Inlines.Add(new Run(Message.Sender + ": ") { Foreground = Message.SenderColour, FontFamily = Message.Font, FontSize = Message.FontSize });
}
//if message has a sender it's either the user or the AI. Format it as a user message.
if (Message.Sender != null) sender.Inlines.Add(new Run(Message.Content) { Foreground = Message.ContentColour, FontFamily = Message.Font, FontSize = Message.FontSize });
else sender.Inlines.Add(new Run(Message.Content) { Foreground = Message.SystemColour, FontFamily = Message.Font, FontSize = Message.FontSize });
}
}
}
答案 0 :(得分:1)
MyApplication.Run(MainConsole);控制线程,直到你关闭窗口后才执行代码。
将代码移动到ConsoleWindow的加载(或初始化)方法