Как запустить таймер на фоне, который обновляет метку в модели представления - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь запустить таймер, который обновляет метку каждую секунду на фоне (asyn c). Таймер должен работать от 0 до 60 минут и показывать только {MIN: SEC} на этикетке. Но мне трудно запустить таймер в фоновом режиме, который обновляет метку. Это то, что у меня было, но оно не будет работать:

Timer timer;
    Stopwatch sw;
    public TimerViewModel()
    {
        Title = "Tijd";
        StartTimer();
    }

    private async void StartTimer()
    {
        timer = new Timer();
        timer.Interval = (1000);
        //timer.Elapsed += new EventHandler(UpdateLabel);
        sw = new Stopwatch();
        timer.Start();
        sw.Start();
    }

    private async void UpdateLabel()
    {
        await Task.Run(async () =>
        {

        }).ConfigureAwait(false);
    }

MainPage:

<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
        xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
        xmlns:views="clr-namespace:EscapeHaarlem.Views"
        x:Class="EscapeHaarlem.Views.MainPage">
<TabbedPage.Children>
    <NavigationPage Title="Tijd">
        <NavigationPage.Icon>
            <OnPlatform x:TypeArguments="FileImageSource">
                <On Platform="iOS" Value="tab_about.png"/>
            </OnPlatform>
        </NavigationPage.Icon>
        <x:Arguments>
            <views:AboutPage />
        </x:Arguments>
    </NavigationPage>

    <NavigationPage Title="Hints">
        <NavigationPage.Icon>
            <OnPlatform x:TypeArguments="FileImageSource">
                <On Platform="iOS" Value="tab_feed.png"/>
            </OnPlatform>
        </NavigationPage.Icon>
        <x:Arguments>
            <views:ItemsPage />
        </x:Arguments>
    </NavigationPage>
</TabbedPage.Children>

О странице:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="EscapeHaarlem.Views.AboutPage"
         xmlns:vm="clr-namespace:EscapeHaarlem.ViewModels"
         Title="{Binding Title}">
<ContentPage.BindingContext>
    <vm:TimerViewModel />
</ContentPage.BindingContext>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="12*" />
        <ColumnDefinition Width="6*" />
        <ColumnDefinition Width="6*" />
        <ColumnDefinition Width="auto" />
    </Grid.ColumnDefinitions>
    <StackLayout x:Name="RealTimeTimer" Grid.Column="0" VerticalOptions="Center">
        <Label Text="{Binding RealTimeTimer}" HorizontalTextAlignment="Center" Rotation="270" FontSize="150" HorizontalOptions="Center"></Label>
    </StackLayout>
    <StackLayout Grid.Column="1" VerticalOptions="Center">
        <Label Text="Straftijd" HorizontalTextAlignment="Center" Rotation="270" FontSize="40" HorizontalOptions="End"></Label>
    </StackLayout>
    <StackLayout Grid.Column="2" VerticalOptions="Center">
            <Label Text="00:00" HorizontalTextAlignment="Center" Rotation="270" FontSize="40" HorizontalOptions="Start" ></Label>
    </StackLayout>
</Grid>

заранее спасибо

1 Ответ

1 голос
/ 14 февраля 2020

Вы ошибочно назначаете обработчик события , как видно из документов .

Изменить

timer.Elapsed += new EventHandler(UpdateLabel);

на

timer.Elapsed +=UpdateLabel; //or 
timer.Elapsed +=System.EventHandler(UpdateLabel)

не уверен, с макушки головы

И

private async void UpdateLabel()

на

private static void UpdateLabel(Object source, System.Timers.ElapsedEventArgs e)

Это должно позволить вам вызвать событие Elapsed. Ваша проблема заключалась в том, что вы вводили в заблуждение обычные функции и функции событий. Вы должны прочитать об этом здесь

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