Запуск секундомера в TextBlock - PullRequest
3 голосов
/ 29 ноября 2011

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

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

<TextBlock Grid.Row="1" Height="23" HorizontalAlignment="Right" Margin="0,0,398,0" Name="textBlockElapsed" Text="{Binding Path=watch.Elapsed, Mode=OneWay}" VerticalAlignment="Top" />

    Stopwatch watch = new Stopwatch();

Ответы [ 3 ]

3 голосов
/ 24 марта 2015

Попробуйте следующий пример кода: MainWindow.xaml.cs

public partial class MainWindow : Window
{

    DispatcherTimer dt = new DispatcherTimer();
    Stopwatch stopWatch = new Stopwatch();
    string currentTime = string.Empty;
    public MainWindow()
    {
        InitializeComponent();
        SystemEvents.SessionEnding += new SessionEndingEventHandler(SystemEvents_SessionEnding);
        SystemEvents.SessionSwitch += new SessionSwitchEventHandler(SystemEvents_SessionSwitch);
        dt.Tick += new EventHandler(dt_Tick);
        dt.Interval = new TimeSpan(0, 0, 0, 0, 1);
    }

    void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
    {
        if (Environment.HasShutdownStarted)
        {
            MessageBox.Show("Total amount of time the system logged on:" + ClockTextBlock.Text);
        }

    }

    void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
    {
        switch (e.Reason)
        {
            // ...
            case SessionSwitchReason.SessionLock:
                if (stopWatch.IsRunning)
                    stopWatch.Stop();                    
                break;
            case SessionSwitchReason.SessionUnlock:
                stopWatch.Start();
                dt.Start();
                break;
            case SessionSwitchReason.SessionLogoff:
                MessageBox.Show("Total amount of time the system logged on:" + ClockTextBlock.Text);
                break;
            // ...
        }
    }

    void dt_Tick(object sender, EventArgs e)
    {
        if (stopWatch.IsRunning)
        {
            TimeSpan ts = stopWatch.Elapsed;
            currentTime = String.Format("{0:00}:{1:00}:{2:00}",
                ts.Hours, ts.Minutes, ts.Seconds);
            ClockTextBlock.Text = currentTime;
        }
    }
    private void StartButton_Click(object sender, RoutedEventArgs e)
    {
        stopWatch.Start();
        dt.Start();
    }

    private void StopButton_Click(object sender, RoutedEventArgs e)
    {
        if (stopWatch.IsRunning)
            stopWatch.Stop();
    }

    private void ResetButton_Click(object sender, RoutedEventArgs e)
    {
        stopWatch.Reset();
        stopWatch.Start();
    }
}

MainWindow.xaml:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />            
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="0.3*"/>
        <RowDefinition Height="0.2*"/>

    </Grid.RowDefinitions>
    <TextBlock Name="ClockTextBlock"
            TextAlignment="Center"
            VerticalAlignment="Center"
            FontSize="35" Foreground="Red"
            Grid.ColumnSpan="4"
            Grid.Row="0" />
    <Button Content="Start"
        Name="StartButton"
        Grid.Row="1"
        Grid.Column="0"
        Width="60" Height="35"
        Click="StartButton_Click" />        
    <Button Content="Stop"
        Name="StopButton"
        Grid.Row="1"
        Grid.Column="1"
        Width="60" Height="35"
        Click="StopButton_Click" />
    <Button Content="Reset"
        Name="ResetButton"
        Grid.Row="1"
        Grid.Column="3"
        Width="60" Height="35"
        Click="ResetButton_Click" />       
</Grid>
2 голосов
/ 29 ноября 2011

Stopwatch не имеет метода Elapsed.У него есть свойство Elapsed, но оно обновляется только при запросе.

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

1 голос
/ 29 ноября 2011

Ниже приведен полный пример.

MainWindow.xaml.cs:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public MainWindow()
    {
        this.Stopwatch = new Stopwatch();
        this.Stopwatch.Start();
        this._timer = new Timer(
            new TimerCallback((s) => this.FirePropertyChanged(this, new PropertyChangedEventArgs("Stopwatch"))),
            null, 1000, 1000);

        InitializeComponent();
    }

    private void FirePropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(sender, e);
        }
    }

    private Timer _timer;

    public Stopwatch Stopwatch { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;
}

MainWindow.xaml:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TextBlock Text="{Binding Path=Stopwatch.Elapsed, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
    </Grid>
</Window>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...