我已经看到了如何使用控制台应用程序和 winforms 应用程序但不是 WPF 应用程序的按键来打破 while 循环的问题的答案。所以,呃,你是怎么做到的?谢谢。
好的,让我们详细说明一下:这样的东西在 WPF(非控制台)应用程序中不起作用。它会引发运行时错误:
while(!Console.KeyAvailable)
{
//do work
}
我已经看到了如何使用控制台应用程序和 winforms 应用程序但不是 WPF 应用程序的按键来打破 while 循环的问题的答案。所以,呃,你是怎么做到的?谢谢。
好的,让我们详细说明一下:这样的东西在 WPF(非控制台)应用程序中不起作用。它会引发运行时错误:
while(!Console.KeyAvailable)
{
//do work
}
MainWindow.xaml:
<Window x:Class="WpfApplication34.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
Width="525"
Height="350">
<Grid>
<TextBlock x:Name="tb" />
</Grid>
</Window>
MainWindow.xaml.cs:
public partial class MainWindow:Window {
private int _someVal = 0;
private readonly CancellationTokenSource cts = new CancellationTokenSource();
public MainWindow() {
InitializeComponent();
Loaded += OnLoaded;
}
private async void OnLoaded(object sender, RoutedEventArgs routedEventArgs) {
KeyDown += OnKeyDown;
while (!cts.IsCancellationRequested) {
await Task.Delay(1000); // Some Long Task
tb.Text = (++_someVal).ToString();
}
}
private void OnKeyDown(object sender, KeyEventArgs keyEventArgs) {
if (keyEventArgs.Key == Key.A)
cts.Cancel();
}
}
只是一个粗略的demo,就拿概念来说吧。这里唯一特定于 WPF 的是捕获按键的方式。在控制台应用程序或 wpf 或 winforms 中,与中断 while 循环相关的所有其他内容都是相同的。
KeyDown Event
您可以在中创建 na 事件MainWindow
并KeyEventArgs e
了解按下了什么键。
private void Window_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.A)
{
// set a flag to break the loop
}
}