Как использовать CommandLineParser в проекте WinForms?Как создать пользовательскую справку MessageBox? - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь использовать библиотеку CommandLineParser в версии 2.5.0 в приложении WinForms.

Отлично работает, за исключением экрана справки (в этом случае MessageBox).

Я уже понял, что мне нужно создать собственный синтаксический анализатор и установить по крайней мере для свойства HelpWriter значение null, чтобы создать пользовательский экран справки.

Но когда приложение вызывается с аргументом --help, мой «Обработчик ошибок» просто получает один экземпляр ошибки с Tag типа CommandLine.ErrorType и значением HelpRequestedError

Теперь, как создать собственный экран справки?

https://github.com/commandlineparser/commandline/wiki/Generating-Help-and-Usage-information

Этот сайт предлагает использовать типы в пространстве имен CommandLine.Text, но как? Есть ноль примеров, как это сделать.

Кто-нибудь здесь делал что-то подобное?

У меня есть следующий код:

namespace myWorkspace
{
    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Windows.Forms;
    using CommandLine;
    using DevExpress.XtraEditors;
    using Options;

    internal static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        internal static int Main(string[] args)
        {
            AppDomain.CurrentDomain.SetupInformation.PrivateBinPath = "bin";

            WindowsFormsSettings.EnableFormSkins();
            WindowsFormsSettings.EnableMdiFormSkins();

            WindowsFormsSettings.ForceDirectXPaint();

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            var parser = new Parser(config =>
            {
                config.AutoHelp = true;
                config.AutoVersion = true;
                config.CaseInsensitiveEnumValues = false;
                config.CaseSensitive = false;
                config.EnableDashDash = true;
                config.HelpWriter = null;
                config.IgnoreUnknownArguments = true;
                //config.MaximumDisplayWidth
                config.ParsingCulture = CultureInfo.InvariantCulture;
            });

            return Parser.Default.ParseArguments<RunOptions>(args)
                  .MapResult(
                             RunRunAndReturnExitCode,
                             RunParsingFailedAndReturnExitCode);
        }

        private static int RunRunAndReturnExitCode(RunOptions opts)
        {
            try
            {
                Application.Run(new MainForm());
            }
            catch
            {
                return -1;
            }
            return 0;
        }

        private static int RunParsingFailedAndReturnExitCode(IEnumerable<Error> errs)
        {
            foreach (var err in errs)
            {
                var locErr = err;
            }
            return 1;
        }
    }
}

И в линии var locErr = err; Я не знаю, что делать, чтобы получить экранное сообщение справки, которое я могу показать в MessageBox или тому подобном.

CommandLineParser, кажется, поддерживает консольный вывод "из коробки" для help или --help, но у меня нет консольного приложения здесь.

1 Ответ

0 голосов
/ 07 июля 2019

Хорошо, теперь я нашел способ сделать это.Кажется, это не лучший способ, но он работает.

Я создаю экземпляр StringBuilder и помещаю его в StringWriter экземпляр

private static StringBuilder helpTextBuilder = new StringBuilder();
private static StringWriter helpTextWriter = new StringWriter(helpTextBuilder);

Затем создаю новый анализатор с(по крайней мере, это) Вариант (ы):

var parser = new Parser(config =>
{
    config.HelpWriter = helpTextWriter;
});

В случае ошибки теперь я могу использовать то, что записано в helpTextBuilder, чтобы показать окно сообщения.

private static int RunParsingFailedAndReturnExitCode(IEnumerable<Error> errs)
{
    MessageBox.Show(helpTextBuilder.ToString());
    return 1;
}

Так что теперь это работает для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...