Задать вопрос
  • Как сделать пропуск исключения при отладке?

    прямо так и делает.
    try {
        throw new Exception(); // 1
    } catch (Exception e) {
        Logger.Log(e.Message); // 2
    }

    Студия приостанавливает работу кода во время возникновения исключения. Если нажать F5, то код пойдёт к catch-у.
    Решение - как вы и сказали в ответе.
  • Как сделать пропуск исключения при отладке?

    Исключения могут ловиться в коде, но студия их тоже ловит и приостанавливает работу кода.
  • Как сработает переопределение?

    Jypsy, в java все неприватные методы являются виртуальными, поэтому, если в классе-наследнике есть одноимённый метод с той же сигнатурой (с теми же типами аргументов), то они переопределяют метод базового класса. В c# метод нужно явно указывать, что он виртуальный, тогда для его переопределения нужно указывать слово override.

    Насколько я понял, в java нет похожего механизма, как new method.
  • C# WPF Графика. Пересечение фигур. Как привести Polygon в Geometry?

    В каком варианте у вас полигон? может, писать его в виде <Geometry>M6,0 L12,4 L9,10 L3,10 L0,4</Geometry>? (в примере - пятиугольник)
  • Как строку форматировать в функцию (C#)?

    На мой взгляд, для новичка лучше не грузить агрегейтами и селектами, а лучше рассказать на простом примере. А linq можно показать отдельно.
    var str = "14 - 15";
    var operationPosition = str.IndexOf('-');
    if (operationPosition >= 0)
    {
        var aStr = str.Substring(0, operationPosition).Trim(); // подстрока до минуса
        var bStr = str.Substring(operationPosition+1).Trim();  // подстрока от минуса и до конца
        int a, b;
        if (int.TryParse(aStr, out a) && int.TryParse(bStr, out b))
        {
            var result = a - b;
            Console.WriteLine($"{a} - {b} = {result}");
        }
        else Console.WriteLine("Требуются числа в выражении!");
    }
    else Console.WriteLine("Требуется выражение в формате N - M, где N и M числа!");

    Не забываем проверять, что введённая строка может быть не в правильном формате! Метод Parse выкидывает исключение, если в строке не число.

    Можно упростить разбор выражения:
    var str = "14 - 15";
    var parts = str.Split('-').Select(p => p.Trim());
    if (parts.Count() == 2)
    {
        // дальше использовать int.TryParse, но вместо aStr и bStr использовать parts[0] и parts[1]
    }
  • С чего начать переход от PHP, JS к C#?

    Год я работал с Битриксом, используя там всевозможные инструменты web разработчика, такие как: php, js, jquery, ajax, ну и по верстке html5 css3.

    Знакомы ли вы с основами программирования? переменные, условия, циклы, функции?
    Знакомы ли с ООП? абстракция, инкапсуляция, наследование, полиморфизм? (после динамических языков вроде php и js сложно понимать полиморфизм в статически типизируемых языках)
    Писали ли вы программы, в которых используется несколько классов?
  • Какие различия между Parse и Convert.To?

    shai_hulud, да, но простой .Parse("0") использует как раз CurrentCulture.
    Кстати, я часто заменяю запятые на точки и использую InvariantCulture, именно вместо мудрения с выбором культуры.
  • Как обработать событие из DataTemplate нажатия радиокнопок?

    Михаил Усоцкий, да, ObservableCollection есть событие CollectionChanged, в нём можно подписываться на новый элемент (и отписываться от удаляемого). Это нужно, если подписываться где-то в другом месте, в xaml это происходит автоматически.

    На мой взгляд, основную логику лучше делать во вьюмоделях, а в xaml, в xaml.cs и в стилях поменьше (xaml - это представление).
  • Как обработать событие из DataTemplate нажатия радиокнопок?

    Михаил Усоцкий,
    >Вместо текста с тремя радиокнопками показывает путь к типу
    Потому что нет шаблона для этого типа, и показывается шаблон по умолчанию, который просто показывает полное имя типа.

    ItemTemplate определяет шаблон для всех элементов. А у вас разные шаблоны у разных типов элемента. Поэтому, тут два варианта - либо не указывать ItemTemplate, а указать разные шаблоны <DataTemplate DataType="{x:Type viewModels:Item}"> (без x:Key и с указанием x:Type в DataType), либо использовать ItemTemplateSelector - это класс, который выберет шаблон по самому объекту элемента, мощный инструмент, например, если тип элемента одинаковый, а шаблон разный.

    Если неохота связываться с разными типами (SelectItem, ContentItem), то используйте селектор. Пример:
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        var itemData = item as SelectItem;
        if (itemData != null)
        {
            if (itemData.MyMode == 0)
            {
                return (DataTemplate)((FrameworkElement)container).FindResource("ContentContext");
            }
            if (itemData.MyMode == 1)
            {
                return (DataTemplate)((FrameworkElement)container).FindResource("SelectContext");
            }
        }
        return null;
    }

    Шаблоны могут быть в ресурсах <ListBox>, в ресурсах <UserControl> или вообще ещё где-нибудь.
  • Как обработать событие из DataTemplate нажатия радиокнопок?

    Михаил Усоцкий, так попробовать можно сделать, но пришлось сделать очень много ненужного кода и заметно увеличить сложность кода. А через конвертер значения вставятся сразу в нужное свойство нужного объекта, достаточно разобраться с датаконтекстом.
  • Как обработать событие из DataTemplate нажатия радиокнопок?

    Обратите внимание, как я показал в ответе: <ListBox ItemsSource="{Binding Items}"/> и без лишних вещей. А нужный шаблон подключается через <DataTemplate DataType="{x:Type viewModels:Item}">.
    Предлагаю подготовить вот такой список в ItemsSource:
    class SeparatorItem
    {
        public Brush Color { get; }
    }
    class SelectItem
    {
        public string DisplayText { get; }
        public int SelectedVariant { get; }
        // ...
    }
    class ContentItem
    {
        public string Text { get; }
        // ...
    }
    public class ItemsList
    {
        public ObservableCollection<object> Items { get; } = new ObservableCollection<object>
        {
            new SeparatorItem { Color = Brushes.Red },
            new SelectItem { DisplayText = "№ 1" },
            new SelectItem { DisplayText = "№ 2" },
            new SelectItem { DisplayText = "№ 3" },
            new SelectItem { DisplayText = "№ 4" },
            new Separator { Color = Brushes.Blue },
            new ContentItem { Text = "что-то там" },
        };
    }

    <UserControl ...>
        <UserControl.Resources>
            <converters:IntToBoolConverter x:Key="IntToBoolConverter"/>
            <DataTemplate DataType="{x:Type viewModels:SeparatorItem}">
                <Separator Foreground={Binding Color} Padding="0" Margin="0"/>
            </DataTemplate>
            <DataTemplate DataType="{x:Type viewModels:SelectItem}">
                ... {Binding DisplayText} ...
            </DataTemplate>
            <DataTemplate DataType="{x:Type viewModels:ContentItem}">
                ... {Binding Text} ...
            </DataTemplate>
        </UserControl.Resources>
        <Grid>
            <ListBox ItemsSource="{Binding Items}"/>
        </Grid>
    </UserControl>
  • Как обработать событие из DataTemplate нажатия радиокнопок?

    Во-первых, если в ItemsSource указан список, то содержимое внутри ListBox не используется (если используется ItemsSource и Items, то возникает исключение). У вас в ItemsSource="{Binding items}" ошибка, нужно написать {Binding Items} (то есть, свойство Items в датаконтексте). А если вы сделаете правильный биндинг, то возникнет исключение. Либо ItemsSource, либо ListBoxItem внутри ListBox.

    Во-вторых, покажите шаблоны SelectContext и ContentContext.
  • Как обработать событие из DataTemplate нажатия радиокнопок?

    Михаил Усоцкий,
    >INotifyPropertyChanged с моделью ViewModel я не очень понимаю
    На самом деле, это крутая фишка wpf. Если в каком-то свойстве контрола используется биндинг, то значение этого свойства автоматически изменится, когда изменилось значение свойства, указанного в биндинге:
    <TextBlock Text="{Binding MyString}"/>
    Осталось только сообщить фреймворку, что это самое свойство изменилось, для этого есть два варианта:
    1) использовать INotifyPropertyChanged в источнике (в датаконтексте). Вызываем событие PropertyChanged тогда, когда изменилось значение (см. пример в моём ответе).
    2) использовать DependencyProperty, внутри которого тоже есть другой механизм уведомления об изменении значений этого свойства.
    Когда в xaml-е написано {Binding}, то этот класс ищет нужное (указанное) свойство источника и проверяет, 1) реализует ли источник INotifyPropertyChanged или 2) указанное свойство является ли свойством зависимости. Если да, то биндинг ожидает изменение свойства, и когда это произошло, то это изменённое значение устанавливается в то свойство, в котором стоит биндинг (в примере выше - это свойство Text у TextBlock-а). Это нужно для того, чтобы фреймворк автоматически изменял (перерисовывал) показываемый контрол.

    {Binding} имеет разные режимы. Если не указан RelativeSource, ElementName или Source, то источником привязанного свойства становится текущий датаконтекст (или датаконтекст ближайшего родителя, у которого датаконтекст установлен).
  • Как обработать событие из DataTemplate нажатия радиокнопок?

    Михаил Усоцкий, а во вьюмодели вы используете INotifyPropertyChanged? Вызываете событие PropertyChanged в свойстве IsChecked?
  • Как избежать проблем с Execution Order?

    ColdSpirit, да, всё верно. Вначале вы указываете те классы, которые вы планируете искать через контейнер. И тогда он пытается разобраться, что и когда нужно инициировать, с учётом взаимных зависимостей.
  • Как избежать проблем с Execution Order?

    ColdSpirit Решение проблемы в том, что всегда можно было найти ссылку на нужный компонент, тем или иным способом. Причём, после Awake этих компонентов. А так как мы (в общем случае) не управляем порядком пробуждения компонентов, то искать их надо в Start.

    На самом деле, это древняя проблема. Юнити даёт методы типа GetComponent и FindObjectOfType, но с ними не всегда удобно, а иногда и вообще нельзя (о чём вы и спрашиваете в вопросе). Но остаётся старый добрый "до-юнитевый" путь - вручную указывать ссылки (через конструкторы и прочее, но у MonoBehavior нет конструктора).

    >Не совсем понял, для чего нужен список в родителе.
    Если компонент на сцене один, то делаем синглтон. Но бывает так, что компонент может быть не один, и нужны ссылки на каждого. Тогда каждый компонент при Awake должен куда-то себя зарегистрировать. В обычное статическое поле класса нельзя. Можно либо в класс сделать статическое поле со списком, либо у родителя сделать класс-холдер с этим списком, либо тот же список в отдельном менеджере.

    >Совсем не понял как использовать IoC
    Я знаю про StrangeIoC и Zenject, наверняка есть и другие. Они как-то там пытаются понять, как работать с MonoBehavior-ами. Сам я с ними не работал.

    Также, мне нравится разделять гейм-логику и юнити - гейм-логика в отдельном месте, где нет доступа в юнити. А Юнити работает только как презентация. См. статьи 1 и 2
  • Как реализовать Таблицу Менделеева?

    А я вот считаю, что показ таблицы Менделеева - отличная задача для обучения сложного UI.
  • Как увеличить скорость работы приложения на слабом ПК?

    Сколько строк в запросе (и сколько строк в DataGrid-е)?