0

まず、免責事項として、あなたが目撃しようとしているのは、ほぼ 20 年間の私の最初のコーディングです。私は C# と WPF を初めて使用します。私の頭の WPF を取得しようとすることは、単なる挑戦ではありません。

この 1 か月間、私はお気に入りのプロジェクト コンソール アプリケーションに取り組んできましたが、これはうまく機能しています。私は現在、最新の GUI をプロジェクトに追加することで、さらに一歩進めようとしています。

WPF ウィンドウのスクローラー内にラップされた WPF テキストブロックを使用して、コンソール (基本的な出力機能のみ) をエミュレートしたいと思います。エミュレートしようとしているコンソール出力の種類をよりよく理解するために、ここで元のコンソール アプリケーションの動作を確認できます。しかし、基本的な関数呼び出しに大きな問題があります。それは、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 メソッドを呼び出すいくつかの Textboxes があり、それが機能するため、.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 });
        }
    }
}
4

1 に答える 1

1

MyApplication.Run(メインコンソール); スレッドを制御し、それ以降のコードはウィンドウを閉じるまで実行されません。

コードを ConsoleWindow の load (または init) メソッドに移動します

于 2013-01-19T01:02:06.247 に答える