【问题标题】:How do you break a while loop with a keypress in WPF?如何在 WPF 中使用按键中断 while 循环?
【发布时间】:2013-07-18 14:55:44
【问题描述】:

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

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

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

【问题讨论】:

    标签: wpf c#-4.0 while-loop keypress


    【解决方案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();
      }
    }
    

    这只是一个粗略的演示,只需了解概念即可。这里唯一特定于 WPF 的是捕获按键的方式。在控制台应用程序、wpf 或 winforms 中,与中断 while 循环相关的所有其他内容都是相同的。

    【讨论】:

    • 对不起,为什么主窗口中有一个TextBlock?这只是为了演示目的而输出一些东西吗?
    • @zetar 是的,就像 Task.Delay(1000) 一样,它只是显示代码实际上在做某事
    • @zetar 另外,如果您还没有查看CancellationTokenSource,请查看Cancellation in Managed Threads,因为通常只有cts.Token 会被传递给您的长期运行函数并且可以调用ThrowIfCancellationRequested() 并在需要的地方进行排序。在此示例中,检测到 KeyDown 是唯一位,而不是 CancellationTokenSource。您甚至可以将此处的cts 切换为bool,这样就可以了。
    【解决方案2】:

    您可以在MainWindow 中的KeyDown Event 中创建na 事件,并让KeyEventArgs e 知道按下了什么键。

    private void Window_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.A)
        {
            // set a flag to break the loop
        }
    }
    

    【讨论】:

    • 这将如何打破另一种方法中的 while 循环?
    • 您可以创建一个标志/全局变量,并且您可以在while循环中进行验证,如果您按下键,您会更改他的状态并中断while循环。
    • 我认为这在 WPF 中不起作用,除非您为循环创建另一个线程。否则 WPF 将在响应任何 KeyDown 消息之前尝试完成循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 2013-06-26
    • 2014-06-26
    • 1970-01-01
    相关资源
    最近更新 更多