Задать вопрос
  • Почему при запросе объекта стиля, получается null?

    Untiwe, ой точно, я просто забыл написать интервал срабатывания :). Скоро поправлю код. Я просто сначала интервал прописал в конструктор, а потом решил его оттуда убрать и присваивать свойству.

    На счет MvvmLight не надо каждый раз объявлять OnPropertyChanged?

    Нет, не надо. Его и у тебя в коде не надо каждый раз объявлять. Ты можешь создать абстрактный класс ViewModelBase и там реализовать интерфейс. И потом от него наследоваться вью моделями. Только зачем? Например, я уже на второй работе использую MvvmLight. На первой я сам его заюзал, на вторую уже пришёл, он там был в проекте. Правда сейчас у меня UWP, а не WPF. После WPF та ещё боль, там урезан функционал биндингов и вообще много мелочей отличаются.
  • Почему при запросе объекта стиля, получается null?

    Untiwe, ещё рекомендую установить XamlStyler и всегда им форматировать XAML. Удобная штука, а Xaml код удобно читать, так как он всегда и везде выглядит одинаково, свойства отсоритрованы.

    613e633723c17558961591.png
  • Почему при запросе объекта стиля, получается null?

    Здесь не происходит никакого ожидания в 1 секунду, у тебя этот код работает в бесконечном цикле без задержек.
    /// <summary>
    /// Запускаем обновление временни на малом табло
    /// </summary>
    private void StartRefrashDateTime()
    {
        Task.Factory.StartNew(() =>
        {
            while (true)
            {
                Dispatcher.Invoke(() =>
                {
                    ClockBox.Text = DateTime.Now.ToString("HH:mm");
                });
    
                Task.Delay(1000);
            }
        });
    }


    Достаточно таймера здесь. Для примера удалил лишнее всё. Метод выше точно нужно удалить совсем. Код без остановки таймера, так как окно у тебя открыто всё время, пока работает приложение, но может стать невидимым. Можешь отключать таймер на это время, в принципе.
    public partial class SmallWindow : Window
    {
        private readonly DispatcherTimer _timer;
    
        /// <summary>
        /// Инициализация класса, малоко окна
        /// </summary>
        public SmallWindow()
        {
            InitializeComponent();
    
            _timer = new DispatcherTimer();
            _timer.Interval = TimeSpan.FromSeconds(1);
            _timer.Tick += OnTimerTick;
            // Запускаем обновление временни на малом табло
            _timer.Start();
        }
    
        private void OnTimerTick(object sender, EventArgs e)
        {
            ClockBox.Text = DateTime.Now.ToString("HH:mm");
        }
    }
  • Почему при запросе объекта стиля, получается null?

    А ещё лучше подключить библиотеку MvvmLight и не изобретать ненужные велосипеды (см. MvvmLightLibsStd10):
    <ItemGroup>
        <PackageReference Include="Extended.Wpf.Toolkit" Version="4.1.0" />
        <PackageReference Include="MvvmLightLibsStd10" Version="5.4.1.1" />
        <PackageReference Include="WpfScreenHelper" Version="1.0.0" />
      </ItemGroup>


    Вот так будет выглядеть твой класс:
    using GalaSoft.MvvmLight;
    
    namespace Monitor
    {
        public class CentralInfoViewModel : ViewModelBase
        {
            private short _period;
            private string _name;
    
            /// <summary>
            /// Номер текущего периода
            /// </summary>
            /// <value>short</value>
            public short Period
            {
                get => _period;
                set
                {
                    if (value < 0)
                        value = 0;
                    // Это тоже самое, что и OnPropertyChanged(nameof(Period));, только ещё и обновляет поле
                    Set(ref _period, value);
                }
            }
    
            public string Name
            {
                get => _name;
                set
                {
                    if (Set(ref _name, value))
                    {
                        // Свойство изменилось, что-то делаем
                    }
                }
            }
        }
    }
  • Почему при запросе объекта стиля, получается null?

    Несколько советов/замечаний

    В сеттерах свойств не нужно писать имена свойств текстом, так как такой код подвержен ошибкам, после его редактирования, а именно переименований свойств. Лучше использовать nameof(PropertyName)
    public short PlayerNomber
    {
        get => _PlayerNomber;
        set
        {
            _PlayerNomber = value;
            OnPropertyChanged("PlayerNomber");
        }
    }


    Можно лучше записывать так:
    public short PlayerNomber
    {
        get => _PlayerNomber;
        set
        {
            _PlayerNomber = value;
            OnPropertyChanged(nameof(PlayerNomber));
        }
    }


    Но в данном случае вообще не нужно ничего указывать, а нужно писать так:
    OnPropertyChanged();

    Так как на место prop будет подставлено имя свойства автоматически
    public void OnPropertyChanged([CallerMemberName] string prop = "")
    { 
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(prop));
    }
  • Почему при запросе объекта стиля, получается null?

    Untiwe, а можно увидеть весь проект? Или проект с воспроизведением проблемы? Я просто видел обрывки кода и лишь примерно представляю, что происходит. Возможно, это как-то легко решается, но проект я не видел и мне сложно что-то советовать. Я бы хотел увидеть проект, где эта проблема решена вышепоказанным способом.
  • Почему при запросе объекта стиля, получается null?

    Untiwe, я погуглил и понял, что нужно создавать программно копию стиля и её менять как угодно. Можно попробовать прочитать готовый XAML как текст и уже этому объекту добавлять сеттеры. Что-то такое я много лет назад писал, нужно поискать. Не обещаю, что найду.
  • Почему при запросе объекта стиля, получается null?

    Untiwe, написано, что нельзя менять, значит уже нельзя ничего добавить, если не создать стиль в коде с нуля. Можешь положить стиль без ключа в App.xaml и он применится ко всем TextBlock в приложении, но, насколько помню, ещё и к тем, которые находятся в стилях контролов, то есть вообще ко всем, даже тем, которые на кнопках пишут текст, например, если я не путаю ничего.
    <Style TargetType="TextBlock" BasedOn="{StaticResource BaseFontFamily}">


    Лучше опиши чётко задачу, что ты пытаешься сделать. Просто применить ко всем текстовым блокам стиль? А зачем тогда что-то добавлять в сеттеры?

    Нельзя присвоить стиль для текстблока окну. Если присвоить стиль окну без таргет тайп или с ним, но для окна, то текстовые блоки это не затронет, это не так работает.
  • Почему при запросе объекта стиля, получается null?

    Untiwe, для ответа на вопрос мало информации. Но включу свои догадки. SetStyle это метод класса BigWindow из чего следует, что свойство Style это свойство класса BigWindow. Так как стиль присваивается BigWindow, то и TargetType стиля должен быть BigWindow, а не TextBlock. Думаю, это ошибка не получения стиля, а присвоения его свойству. Так это или нет проверить легко, но судя по сообщению это так.

    И чуть не в тему, но я бы сначала добавлял новый Setter, а потом свойству присваивал стиль. Приводить к типу нужно с использованием as только если ожидается, что не удастся привести к типу Style ресурс с именем "NumbersStyle".
  • Почему при запросе объекта стиля, получается null?

    Untiwe, неважно, где ты получаешь стиль. Важно, к чему ты его применяешь. Если ты создал стиль для TextBlock, а присваиваешь его окну, то получишь ошибку по понятным причинам.

    Еще пришлось x:Name="NubmersStyle" поменять на x:Key="NubmersStyle"

    Так ты опять написал одно и тоже. В комментарии точно.

    Наверное, имелось ввиду Numbers, а ты написал Nubmers
  • Практические задания .net c#?

    Посоветуй хорошие задачники по вебу )
  • Как пeредать const char* в c++ фунцию из c#?

    Никита Цуканов — Кросс платформенное объектно ориентированное взаимодействие C# и C++
    ссылка на YouTube видео.

    C++ через C# — Егор Богатов
    ссылка на YouTube видео.

    Calling Native Functions from Managed Code
  • Книги по C# с паттернами и примерами архитектуры?

    Илья, почитал ещё и комментарии, пришёл к выводу, что не факт, что книга плохая. Всё зависит от того, как ты трактуешь написанное. В любом случае, лучше самому прочесть, чем верить на слово статьям из интернета.
  • Книги по C# с паттернами и примерами архитектуры?

    Илья, почитал пару статей, в принципе, мне понятно почему нет. Потому что автор имел ввиду не то! Его опыт больше про С++.
  • Как мне это реализовать в List?

    Yugg0, судя по картинке не для каждого уровня есть значения, значит должно быть так. Конкретно в данном примере T должен быть class, не struct:
    public class TestScript : MonoBehaviour
    {
        [SerializeField] private List<TestEvent> _testEvents;
    
        private int a = 3;
    
        void Start()
        {
            var element = GetFirstOrDefault(_testEvents, item => item.B == a);
            if (element is not null)
            {
                c = element.c;
                r = element.r;
                u = element.u;
            }
        }
    
        // Если совпадение не найдено, то вернуть значение по умолчанию.
        private static T GetFirstOrDefault<T>(IEnumerable<T> items, Func<T, bool> predicate)
        {
            foreach (var item in items)
            {
                if (predicate(item))
                {
                    return item;
                }
            }
    
            return default;
        }
    }
  • Как мне это реализовать в List?

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

    public class TestScript : MonoBehaviour
    {
        [SerializeField] private List<TestEvent> _testEvents;
    
        private int a = 3;
    
        void Start()
        {
            var element = GetFirst(_testEvents, item => item.B == a);
            c = element.c;
            r = element.r;
            u = element.u;
        }
    
        // Если нужно найти первый элемент в любом случае, его отсуствие это ошибка.
        private static T GetFirst<T>(IList<T> items, Func<T, bool> predicate)
        {
            for (int i = 0; i < items.Count; i++)
            {
                if (predicate(items[i]))
                {
                    return items[i];
                }
            }
    
            throw new InvalidOperationException("No matches found.");
        }
    }
  • Как мне это реализовать в List?

    Yugg0, в том коде, который ты показал тебе не нужен индекс. Тот объект, который ты вытаскиваешь из _testEvents уже найден и лежит в testEvent переменной: foreach (var (index, testEvent) in events).
  • Как мне это реализовать в List?

    Yugg0, ну так это ты обращаешься к одному элементу. Если у тебя в таблице для каждого уровня только один объект с параметрами, то тебе не нужно получать коллекцию, так как в ней всегда будет только один элемент.