Ответы пользователя по тегу C#
  • FolderPicker открывает обычный FilePicker заместо выбора папки, как исправить?

    @romazhan
    Попробуйте:
    FolderBrowserDialog dialog = new FolderBrowserDialog();
    
    if (dialog.ShowDialog() == DialogResult.OK)
    {
            Console.WriteLine(dialog.SelectedPath);
    }
    Ответ написан
  • Как сделать фильтр слов в (TMP_)InputField?

    @romazhan
    Для реализации фильтра слов в `TMP_InputField` вы можете использовать регулярные выражения. Регулярные выражения позволяют искать в тексте определенные шаблоны символов, которые определяются с помощью специального синтаксиса.

    Для реализации фильтра в вашем случае нужно создать регулярное выражение, которое будет искать слова, которые вы хотите фильтровать. Например, чтобы удалить слово "лох" из текста, можно использовать следующее регулярное выражение: /\bлох\b/gi
    Это выражение ищет слово "лох" (без учета регистра, благодаря флагу "i"), находящееся отдельно от других слов. Символы "\b" обозначают границу слова.

    Чтобы воспользоваться регулярным выражением в вашем скрипте, вам нужно будет использовать класс `System.Text.RegularExpressions.Regex`:
    string inputText = "Привет, меня зовут Иван и я не лох";
    string pattern = @"/\bлох\b/gi";
    string replacement = "";
    string result = Regex.Replace(inputText, pattern, replacement);
    
    Debug.Log(result);
    Ответ написан
    Комментировать
  • Как сделать авторизацию в WPF приложении?

    @romazhan
    Да.

    Чтобы реализовать систему авторизации, вам нужно будет сделать следующее:
    -
    Создайте удаленную базу данных MySQL и таблицу, хранящую информацию о пользователях (логины и пароли).
    -
    В вашем WPF приложении создайте окно авторизации с полями для ввода логина и пароля.
    -
    При нажатии на кнопку "Войти" приложение должно отправлять запрос к удаленной базе данных, чтобы проверить, существует ли пользователь с указанными данными.
    -

    Если пользователь существует, приложение должно сохранить информацию о нем в переменную (например, в сессии) и открыть главное окно приложения. Если пользователь не существует, приложение должно вывести сообщение об ошибке.

    Чтобы подключиться к удаленной базе данных MySQL из C#, вам нужно будет установить нужный пакет NuGet. В качестве пакета можете использовать MySql.Data. После установки пакета вы сможете подключиться к удаленной базе данных с помощью кода, похожего на следующий:
    using MySql.Data.MySqlClient;
    
    string connectionString = "server=yourserver;user id=yourusername;password=yourpassword;database=yourdatabase";
    
    MySqlConnection connection = new MySqlConnection(connectionString);
    connection.Open();
    Ответ написан
    Комментировать
  • Как извлечь ресурсы добавляемые через EmbeddedResources.Add на другой стороне?

    @romazhan
    Вам нужно использовать класс Assembly и метод GetManifestResourceStream. Например, чтобы получить поток данных для встроенного ресурса с именем mainVoice.mp3, вы можете использовать следующий код:
    Assembly assembly = Assembly.LoadFrom(@"путь к скомпилированному файлу");
    Stream stream = assembly.GetManifestResourceStream("mainVoice.mp3");

    После этого можно использовать поток данных для чтения ресурса, например, с помощью класса StreamReader или скопировать его в массив байтов с помощью метода ReadBytes.

    Важно указать имя ресурса с учетом того, что он может быть вложен в папку ресурсов. Например: (folder/resource) Resources/mainVoice.mp3 -> Resources.mainVoice.mp3.

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

    Чтобы скопировать поток в массив байтов:
    using (MemoryStream memoryStream = new MemoryStream())
    {
        stream.CopyTo(memoryStream);
        byte[] resourceBytes = memoryStream.ToArray();
    }

    Кстати нужно будет обработать исключения, так как операция чтения может завершиться с ошибкой.

    Также можно использовать класс StreamReader для чтения ресурса из потока данных. Например, чтобы считать ресурс как текстовую строку:
    using (StreamReader reader = new StreamReader(stream))
    {
        string resourceText = reader.ReadToEnd();
    }
    Ответ написан
    1 комментарий
  • Где хранить глобальный стейт приложения, написанного на Винформах?

    @romazhan
    Для хранения глобального стейта приложения существует несколько вариантов:
    1. Хранение в статических переменных: Вы можете хранить глобальный стейт в статических переменных класса. Этот вариант хорошо подходит, если глобальный стейт нужен для всего приложения и не изменяется. Однако, статические переменные могут быть небезопасными в многопоточном окружении (риск неочевидных проблем с тестированием).
    2. Хранение в инстансе главной формы: этот вариант может быть хорошим выбором, если глобальный стейт используется только в рамках главной формы и доступ к нему, из других частей приложения, не требуется. Однако, этот вариант не очень хорош, если главная форма не существует или не открыта.
    3. Использование DI-контейнера: этот вариант может быть хорошим выбором, если Вы используете DI в своем приложении. Вы можете регистрировать ваш синглтон-провайдер базы данных и другие глобальные переменные в контейнере DI и получать доступ к ним из любой части приложения с помощью зависимостей. Я считаю этот вариант самым лучшим, так как он позволяет следовать принципу единственной ответственности, упрощает тестирование, улучшает возможности масштабирования и расширения приложения.

    Важно понимать, что нужно соблюдать соглашения об использовании глобального стейта в рамках вашего приложения и обеспечивать правильное синхронизирование доступа к нему в многопоточном окружении. В общем случае, если Ваше приложение сложное и использует DI, то использование DI-контейнера для хранения глобального стейта может быть хорошим выбором. Этот вариант позволяет управлять зависимостями и обеспечивает хорошую масштабируемость и расширяемость.
    Ответ написан
    Комментировать