Показать текущее время WPF - PullRequest
0 голосов
/ 26 июня 2018

Единственный способ регулярно показывать текущее время, которое я нашел, - это использовать таймер. Конечно, я могу реализовать INotifyPropertyChanged и некоторые специальные свойства, которые будут использоваться в пользовательском интерфейсе, но эта реализация AFAIK также нуждается в Timer. Например, как здесь . Есть ли лучший способ для отображения текущего времени?

Редактировать

Чтобы уточнить: есть ли декларативный способ заставить его работать в режиме реального времени без таймера с использованием синтаксиса XAML, подобного этому?

<Label Content="{x:Static s:DateTime.Now}" ContentStringFormat="G" />

Ничто не мешает мне использовать таймер здесь. Я просто хочу знать, есть ли более элегантный и компактный способ реализации этого.

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Использование Task.Delay может привести к высокой загрузке ЦП!

В коде XAML напишите:

<Label Name="LiveTimeLabel" Content="%TIME%" HorizontalAlignment="Left" Margin="557,248,0,0" VerticalAlignment="Top" Height="55" Width="186" FontSize="36" FontWeight="Bold" Foreground="Red" />

Далее в xaml.cs напишите это:

[...]
public MainWindow()
{
    InitializeComponent();
    DispatcherTimer LiveTime = new DispatcherTimer();
    LiveTime.Interval = TimeSpan.FromSeconds(1);
    LiveTime.Tick += timer_Tick;
    LiveTime.Start();
}

void timer_Tick(object sender, EventArgs e)
{
    LiveTimeLabel.Content = DateTime.Now.ToString("HH:mm:ss");
}
[...]
0 голосов
/ 26 июня 2018

WPF - это язык статической разметки. Насколько я знаю, в чистом XAML нет механизма, который бы обеспечивал то, что вы ищете.

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

MainWindow XAML:

<Window x:Class="AsyncTimer.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:AsyncTimer"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Label Content="{Binding CurrentTime}"></Label>
    </Grid>
</Window>

Код позади:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        DataContext = new CurrentTimeViewModel();
    }
}

public class CurrentTimeViewModel : INotifyPropertyChanged
{
    private string _currentTime;

    public CurrentTimeViewModel()
    {
        UpdateTime();
    }

    private void UpdateTime()
    {
        Task.Run(() =>
        {
            CurrentTime = DateTime.Now.ToString("G");
            Task.Delay(1000);
            UpdateTime();
        });
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public string CurrentTime
    {
        get { return _currentTime; }
        set { _currentTime = value; OnPropertyChanged(); }
    }
}

Это, вероятно, один из наиболее лаконичных и, безусловно, "Modern" WPF, которые вы получите.

...