Контакты

Достижения

Все достижения (6)

Наибольший вклад в теги

Все теги (26)

Лучшие ответы пользователя

Все ответы (68)
  • Как упростить переменную в C#?

    FoggyFinder
    @FoggyFinder
    Можно вынести в отдельную функцию:

    string CreateASCIIStr(string value) => Encoding.ASCII.GetString(Convert.FromBase64String(value));


    или, в локальную, с использованием LocalData:

    string CreateASCIIStr(string value) =>
                    LocalData + Encoding.ASCII.GetString(Convert.FromBase64String(value));


    Добавлено:

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

    В данном случае у вас есть многократный последовательный вызов двух методов:

    Convert.FromBase64String и Encoding.ASCII.GetString

    для удобства их совмещаем в один вызов и получаем

    Encoding.ASCII.GetString(Convert.FromBase64String(value))

    Пример:

    string LocalData = "0";
    string CreateASCIIStr(string value) =>
        LocalData + Encoding.ASCII.GetString(Convert.FromBase64String(value));
    
    var data = new[] {
        CreateASCIIStr("Тут"),
        CreateASCIIStr("Все"),
        CreateASCIIStr("значения"),
        CreateASCIIStr("будут"),
        CreateASCIIStr("совершенные"),
        CreateASCIIStr("Разные")
    };


    Здесь возвращается массив, но если ваши совершенно разные значения в действительности являются массивом, то и обрабатывать их лучше как массив ;-)
    Ответ написан
  • Как переделать код (см. внутри)?

    FoggyFinder
    @FoggyFinder
    Давайте попробуем вместе разобраться как решать подобные вопросы.

    В таких случаях первое что нужно сделать это правильно докопаться до корня проблемы.

    Ваша задача убрать использование пространства имен System.Drawing.

    Что для этого нужно сделать?
    1. Убрать вверху заголовочный using
    using System.Drawing;
    2. Удалить ссылку на сборку

    Теперь пробуем скомпилировать проект, получаем ошибки:

    error CS0246: Не удалось найти тип или имя пространства имен "Point" (возможно, отсутствует директива using или ссылка на сборку)


    Значит вопрос можно переформулировать примерно следующим образом:

    Чем можно заменить класс Point из System.Drawing?


    Согласитесь, что чем более конкретен вопрос тем легче на него ответить.

    Итак, всего одна ошибка значит большого труда исправление не составит. Не хватает одного класса Point. Можно пойти посмотреть исходники и скопировать класс оттуда, но мы пойдем другим путем.

    Компилятор пишет что нужен класс? Окей, давайте создадим класс

    class Point
    {
    
    }


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

    if (field[i, j] == "0") current = new Point(i, j);

    1>error CS1061: "Point" не содержит определения "X", и не удалось найти доступный метод расширения "X", принимающий тип "Point" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку).


    if ((i == current.X) && (j == current.Y))


    1>error CS1061: "Point" не содержит определения "Y", и не удалось найти доступный метод расширения "Y", принимающий тип "Point" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку).
    1>error CS1061: "Point" не содержит определения "Y", и не удалось найти доступный метод расширения "Y", принимающий тип "Point" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку).


    Кажется, все понятно. Мы пытаемся использовать несуществующий конструктор и несуществующие свойства.

    Добавляем все необходимое. Компилятор ругается на два свойства и ожидает увидеть конструктор с двумя параметрами? Ага, зависимость видна - каждому параметру соответствует свое свойство с названиями X и Y соответственно.

    Как определить их тип? Смотрим что мы пытаемся туда передать? i , j - целые числа - int. Значит его и ставим.

    class Point
    {
        public int X { get; set; }
        public int Y { get; set; }
    
        public Point(int x, int y)
        {
            X = x;
            Y = y;
        }
    }


    Пробуем скомпилировать? Ошибок нет, можно переходить к этапу проверки работоспособности.
    Ответ написан
  • NET Core. Как перенести с виндовс на mac os?

    FoggyFinder
    @FoggyFinder
    Собрать приложение под другую платформу можно с помощью команды publish

    dotnet publish

    с указанием правильного runtime. Например:

    dotnet publish -c Release --framework netcoreapp2.0 --runtime osx-x64
    Ответ написан
  • Как динамически менять значение TextBox, если Binding идет через Dictionary?

    FoggyFinder
    @FoggyFinder
    Чтобы сообщить представлению (View) об изменении значения конкретного свойства из VM нужно передать его название в виде параметра:

    OnPropertyChanged(nameof(TextBoxes));

    Непосредственно в самих свойствах вы можете увидеть что идет вызов без передачи параметров:

    OnPropertyChanged();

    Дело в том, что в типичной реализации имя свойства извлекается при помощи атрибута CallerMemberName:

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged([CallerMemberName]string prop = "")
    {
    // ...
    }


    Это не обязательно делать в set. У свойства может не быть открытого сеттера или не быть сеттера вообще. Или если свойство зависит от двух других - например, для автоматического отображения суммы значений, которые должен вводить пользователь.

    В вашем случае с TextBoxes вы не используете сеттер - его можно даже совсем убрать.
    Ответ написан
  • Можно ли во ViewModel узнать ширину элемента View?

    FoggyFinder
    @FoggyFinder
    Зависит от того зачем вам нужна информация о размерах UI - элементов.

    Если это часть пользовательских настроек, то хранить их на уровне ViewModel совершенно нормально и никак не противоречит паттерну.

    Но если это нужно исключительно для временной настройки UI, то и код должен находится на уровне View.

    Для вашего примера решение будет таким: добавьте обработчик события клика на кнопку и выводить информацию там.

    MVVM это не означает что в code-behind не должно быть никакого кода. Это типичная ошибка. В .xaml.cs не должно быть того, что не относится непосредственно к отображению.

    Управление анимацией, вывод вспомогательных сообщений, кастомизация пользовательских элементов управления - все это может быть там.
    Ответ написан