#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 в потоке пользовательского интерфейса, чтобы вы не получили эту ошибку. Пожалуйста, дайте мне знать, если это сработает для вас.