Отображение случайных чисел с помощью DispatcherTimer - PullRequest
0 голосов
/ 12 июня 2019

Я искал ответ, но ни один из них не подходит под мой вопрос.

Я пытаюсь адаптировать метод MvVM , но я не думаю, что полностью его понимаю ...

Я пытаюсь создать отображение RPM в WPF.

Я хочу, чтобы он отображал число (от 0 до 3000) и обновлял его каждую секунду (до TextBlock).

Я создал новый класс, в котором я пытаюсь создать генератор DispatcherTimer и Random, а затем помещаю его в текстовый блок пользовательского интерфейса.

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Threading;

namespace Aldeba.UI.WpfClient
{
    public class GenerateRpm
    {
        public GenerateRpm()
        {
            DispatcherTimer timer = new DispatcherTimer
            {
                Interval = new TimeSpan(0, 0, 5)
            };
            timer.Start();
            timer.Tick += Timer_Tick;
        }
        public int RandomValue()
        {
            Random random = new Random();
            int RandomRpm = random.Next(0, 3001);
            return RandomRpm;
        }
        void Timer_Tick(object sender, EventArgs e)
        {
            MainWindow mainWindow = new MainWindow();

            GenerateRpm rpm = new GenerateRpm();
            mainWindow.RpmDisplayLabel.Text = rpm.RandomValue().ToString();
        }
    }
}

Мой файл MainWindow.xaml.cs выглядит следующим образом ...

   /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.DataContext = new MainWindowViewModel();
            this.DataContext = new GenerateRpm();
        }
    }
}

Нужно ли добавлять datacontext ко всем классам, к которым я хочу получить доступ (для привязок для примера)?

Это главное окно, в котором я хочу, чтобы число оборотов отображалось во второмTextBlock.

<StackPanel Orientation="Horizontal" Grid.Row="0" Grid.Column="1" HorizontalAlignment="Right" VerticalAlignment="Center">
            <TextBlock Text="RPM:" Style="{StaticResource RpmDisplay}" />
            <TextBlock x:Name="RpmDisplayLabel" Text="{Binding }" Style="{StaticResource RpmDisplay}" />
        </StackPanel>

Что я упускаю и / или делаю неправильно, чтобы иметь возможность сделать это?

1 Ответ

1 голос
/ 12 июня 2019

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

Убедитесь, что установщик свойств запускает уведомление об изменении, например, событие PropertyChanged интерфейса INotifyPropertyChanged.

public class MainWindowViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private readonly Random random = new Random();

    public MainWindowViewModel()
    {
        var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
        timer.Tick += Timer_Tick;
        timer.Start();
    }

    private int randomRpm;

    public int RandomRpm
    {
        get { return randomRpm; }
        set
        {
            randomRpm = value;
            PropertyChanged?.Invoke(
                this, new PropertyChangedEventArgs(nameof(RandomRpm)));
        }
    }

    private void Timer_Tick(object sender, EventArgs e)
    {
        RandomRpm = random.Next(0, 3001);
    }
}

Назначьте экземпляр класса модели представления для DataContext MainWindow:

public MainWindow()
{
    InitializeComponent();

    DataContext = new MainWindowViewModel();
}

В представлении привяжите элемент к свойству модели представления:

<TextBlock Text="{Binding RandomRpm}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...