4

我已经看到了如何使用控制台应用程序和 winforms 应用程序但不是 WPF 应用程序的按键来打破 while 循环的问题的答案。所以,呃,你是怎么做到的?谢谢。

好的,让我们详细说明一下:这样的东西在 WPF(非控制台)应用程序中不起作用。它会引发运行时错误:

while(!Console.KeyAvailable)
{
//do work
}    
4

2 回答 2

1

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 循环相关的所有其他内容都是相同的。

于 2013-07-18T15:21:44.703 回答
1

KeyDown Event您可以在中创建 na 事件MainWindowKeyEventArgs e了解按下了什么键。

private void Window_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.A)
    {
        // set a flag to break the loop
    }
}
于 2013-07-18T15:02:15.987 回答