Попытка включить таймер в игру с помощью Visual Studio с использованием C#

#c# #xaml #timer #visual-studio-2015

#c# #xaml #таймер #visual-studio-2015

Вопрос:

Я новичок в разработке на C #, но я пытаюсь написать игру для своих детей, которая включает таймер. Я использую Microsoft Visual Studio Community 2015 (версия 14.0.25431.01 Обновление 3). Я использую «Пустой» шаблон и ориентируюсь на универсальную Windows, «Windows 10 Anniversary Edition (10.0; Сборка 14393)».

В MainPage.xaml я предположил, что смогу щелкнуть панель инструментов и выбрать элемент управления «Таймер», который затем появится в коде внизу, и на который я затем смогу ссылаться в MainPage.xaml.cs.

Однако нет элемента управления «Таймер», доступного для выбора из списка «Все элементы управления XAML», и когда я пытаюсь вставить «с помощью System.Timers» в MainPage.xaml.cs, похоже, не распознает его.

Все, что мне нужно, это чтобы таймер начинал «тикать» при нажатии кнопки «Пуск» и разрешал ввод в течение фиксированного количества секунд, прежде чем «истечь время ожидания» и перейти к следующему вопросу.

Любые указания будут приняты с благодарностью!

Комментарии:

1. Быстрый поиск в Google: msdn.microsoft.com/en-us/library /…

Ответ №1:

Похоже, вы привыкли программировать в интерфейсе перетаскивания WinForms или VB6… Для выполнения того, что вы описываете, вам понадобятся кнопка и элемент управления вводом в вашем XAML, а затем таймер будет находиться в коде (или, если вы следуете MVVM, он будет жить в вашей модели представления). Простая реализация этого может выглядеть так:

MainPage.xaml

 <Grid>
    <Grid.RowDefinitions>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
    </Grid.RowDefinitions>
    <Button Grid.Row="0" x:Name="StartButton" HorizontalAlignment="Stretch" Content="Start" Click="StartButton_Click" />
    <TextBox Grid.Row="1" x:Name="InputField" HorizontalAlignment="Stretch" ></TextBox>
    <TextBlock Grid.Row="2" x:Name="StatusText" HorizontalAlignment="Stretch"></TextBlock>
</Grid>
  

MainPage.xaml.cs

 using System.Threading;
using Window.UI.Xaml;
using Window.UI.Xaml.Controls;

namespace UniversalTimerApp
{
    public sealed partial class MainPage : Page
    {
        private Timer questionTimer;
        public MainPage()
        {
            this.InitializeComponent();

            this.questionTimer = new Timer(this.EndOfTimer, null, Timeout.Infinite, Timeout.Infinite);
        }

        private void StartButton_Click(object sender, RoutedEventArgs e)
        {
            this.questionTimer.Change(3000, Timeout.Infinite);
            this.StatusText.Text = "Timer Started!";
        }

        private async void EndOfTimer(object state)
        {
            await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                this.InputField.IsEnabled = false;
                this.StatusText.Text = "Timer Ended.";
            });
        }
    }
}
  

Комментарии:

1. Спасибо, Сэм. Я попробовал то, что вы предлагаете, но когда я нажимаю на кнопку «Пуск», я получаю задержку около 5 секунд, а затем следующую ошибку:

2. Спасибо, Сэм. Я попробовал то, что вы предлагаете, но когда я нажимаю на кнопку «Пуск», я получаю задержку около 5 секунд, а затем следующую ошибку: «Исключение не было обработано пользовательским кодом. Исключение типа ‘System. Исключение’ произошло в App4.exe но не был обработан в пользовательском коде. Дополнительная информация: приложение вызвало интерфейс, который был маршалирован для другого потока. (Исключение из HRESULT: 0x800101E (RPC_E_WRONG_THREAD))»

3. @Richard Я обновил свой ответ, чтобы запустить код обновления пользовательского интерфейса в методе EndOfTimer в потоке пользовательского интерфейса, чтобы вы не получили эту ошибку. Пожалуйста, дайте мне знать, если это сработает для вас.