Отображать информацию на экране во время процесса - PullRequest
0 голосов
/ 21 декабря 2018

Я хочу отобразить информацию на экране для общего представления о процессе!

Сначала я использовал другой поток, но это вызвало исключение.Теперь я не знаю.Как я могу изменить значение на экране одновременно с другим процессом?

Как я могу использовать GetElapsedTime для отображения прошедшей миллисекунды во время процесса?

WPF (код XAML)

<StackPanel>
    <Button Content="Start" Height="20" Width="50" HorizontalAlignment="Left" Name="ButtonStart" Click="ButtonStart_Click"/>
    <Label Content="Elapsed Time (Milliseconds):"/>
    <Label Name="LabelElapsedTime" Content="0"/>
</StackPanel>


public partial class MainWindow : Window
{
    private StatusOfWork _StatusOfWork;
    public MainWindow()
    {            
        InitializeComponent();
    }


    private void ButtonStart_Click(object sender, RoutedEventArgs e)
    {
        _StatusOfWork = new StatusOfWork();
        _StatusOfWork.CountN(10);
        this.Close();
    }
}

class StatusOfWork
{
    public DateTime StartDateTime { get; set; }

    public void CountN(int nTimes)
    {
        StartDateTime = DateTime.Now;
        for (int i = 1; i <= nTimes; i++)
        {
            //doing anything
            //Another Process
            //...
            Thread.Sleep(1000);
        }
    }

    public double GetElapsedTime()
    {
        TimeSpan timeSpan = DateTime.Now - StartDateTime;
        return timeSpan.TotalMilliseconds;
    }
}

1 Ответ

0 голосов
/ 21 декабря 2018

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

Как говорится, вот изменение в вашем коде, которое должно помочь вам начать: я добавил привязку к вашемуметка LabelElapsedTime называется LapsedTime.

<StackPanel>
    <Button Content="Start" Height="20" Width="50" HorizontalAlignment="Left" Name="ButtonStart" Click="ButtonStart_Click"/>
    <Label Content="Elapsed Time (Milliseconds):"/>
    <Label Name="LabelElapsedTime"
        Content="{Binding ElapsedTime, RelativeSource={RelativeSource AncestorType=Window}}"/>
</StackPanel>

и привязка сопоставляется со свойством зависимости с тем же именем LapsedTime в вашем главном окне следующим образом:

public partial class MainWindow : Window
{
    private StatusOfWork _StatusOfWork;

    public MainWindow()
    {
        InitializeComponent();
    }

    public static readonly DependencyProperty ElapsedTimeProperty =
        DependencyProperty.Register(nameof(ElapsedTime), typeof(string), typeof(MainWindow));

    public string ElapsedTime
    {
        get { return (string)GetValue(ElapsedTimeProperty); }
        set { SetValue(ElapsedTimeProperty, value); }
    }

    private async void ButtonStart_Click(object sender, RoutedEventArgs e)
    {

        for(int count = 0; count < 10; count ++)
        {
            ElapsedTime = string.Format("{0}", count);
            await Task.Delay(1000);
        }
        this.Close();
    }
}

Дляради простоты, я сохранил свойство в виде строки, но вы можете использовать другой тип данных.Вам нужно будет использовать ValueConverter.Ссылки в упомянутой выше статье stackoverflow объясняют это более подробно.

Дополнительно : Я предполагаю, что исключение, которое вы получили с использованием потока, вероятно, является исключением отправки.Это хорошая статья , которая поможет вам понять, как это исправить.

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