Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 等待用户单击C WPF_C#_Wpf_Events_Mouseevent - Fatal编程技术网

C# 等待用户单击C WPF

C# 等待用户单击C WPF,c#,wpf,events,mouseevent,C#,Wpf,Events,Mouseevent,我希望当用户单击按钮时,程序等待用户单击窗口,并且不会继续执行下一行代码,除非通过单击窗口获得一个点。然后,如果采集到,将处理下一行并显示该点 <Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

我希望当用户单击按钮时,程序等待用户单击窗口,并且不会继续执行下一行代码,除非通过单击窗口获得一个点。然后,如果采集到,将处理下一行并显示该点

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Button Content="Pick Point &amp; Display it!" HorizontalAlignment="Left" Margin="301,172,0,0" VerticalAlignment="Top" Width="168" Click="Button_Click" RenderTransformOrigin="1.479,2.177"/>

    </Grid>
</Window>


    private void Button_Click(object sender, RoutedEventArgs e)
    {
        var point = WaitTillUserClicks();

        MessageBox.Show(point.ToString());
    }

    private Point WaitTillUserClicks()
    {
        // Prompt the user for a mouse click and do not proceed unless he has clicked at least once on the Window
    }
这样行吗

private void Button_Click(object sender, RoutedEventArgs e)
    {
      this.PreviewMouseLeftButtonDown += MainWindow_PreviewMouseLeftButtonDown;
    }

 private void MainWindow_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
       this.PreviewMouseLeftButtonDown -= MainWindow_PreviewMouseLeftButtonDown;
       Point point = e.GetPosition(this);
       MessageBox.Show(point.ToString());
       e.Handled = true;
    }
你不需要用这个,我只是喜欢用它,不确定这是否是一个好的做法

这样行吗

private void Button_Click(object sender, RoutedEventArgs e)
    {
      this.PreviewMouseLeftButtonDown += MainWindow_PreviewMouseLeftButtonDown;
    }

 private void MainWindow_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
       this.PreviewMouseLeftButtonDown -= MainWindow_PreviewMouseLeftButtonDown;
       Point point = e.GetPosition(this);
       MessageBox.Show(point.ToString());
       e.Handled = true;
    }
你不需要用这个,我只是喜欢用它,不确定这是否是一个好的做法

这里有一个解决方案

这里有一个解决方案



async/await和TaskCompletionSource是您的朋友here@SirRufo谢谢,但是我怎样才能返回结果呢?我希望代码流在WaitTillUserClicks停止,而UI等待用户单击。async/wait和TaskCompletionSource是您的朋友here@SirRufo谢谢,但是我怎样才能返回结果呢?我希望代码流在WaitTillUserClicks停止,而UI等待用户单击。谢谢Ivan,它可以工作。但在我最初的问题中,我想把它作为var point=WaitTillUserClicks;我希望te代码在此函数处停止,直到单击鼠标为止。据我所知,事件处理程序(如Button_Click)正在主STA线程中执行,因此您不能在事件处理程序方法内部等待,因为用户界面将被冻结。我不确定你到底想要实现什么,但是如果你需要在函数中间等待,你必须考虑使用线程、任务、后台工作人员等功能在另一个线程中这样做。但是无论如何,您都需要访问主线程变量,所以我真的不明白您为什么需要它。你能提供一些关于你的目标的更多信息吗?我想把所有这些封装在一个像WaitTillUserClicks这样的方法中,并把它放在像'var point=Utility.WaitTillUserClicks'这样的类中,然后每当用户调用这个方法,代码流暂停,并要求用户单击窗口;当代码到达此行时,它会强制您输入一些值并按enter键,然后再转到下一行代码。我想要接受鼠标点击的相同行为。我认为您可以使用ShowDialog在主窗口顶部显示另一个透明窗口。但是我仍然不明白这个用例是什么。谢谢伊万,它很有效。但在我最初的问题中,我想把它作为var point=WaitTillUserClicks;我希望te代码在此函数处停止,直到单击鼠标为止。据我所知,事件处理程序(如Button_Click)正在主STA线程中执行,因此您不能在事件处理程序方法内部等待,因为用户界面将被冻结。我不确定你到底想要实现什么,但是如果你需要在函数中间等待,你必须考虑使用线程、任务、后台工作人员等功能在另一个线程中这样做。但是无论如何,您都需要访问主线程变量,所以我真的不明白您为什么需要它。你能提供一些关于你的目标的更多信息吗?我想把所有这些封装在一个像WaitTillUserClicks这样的方法中,并把它放在像'var point=Utility.WaitTillUserClicks'这样的类中,然后每当用户调用这个方法,代码流暂停,并要求用户单击窗口;当代码到达此行时,它会强制您输入一些值并按enter键,然后再转到下一行代码。我想要接受鼠标点击的相同行为。我认为您可以使用ShowDialog在主窗口顶部显示另一个透明窗口。但我仍然不明白这个用例是什么。谢谢,我已经做到了这一点,但我的问题是如何将它封装到我在评论中描述的方法中。例如,如果检查Console.ReadLine方法,当代码流到达该方法时,它会强制您在继续下一行代码之前输入一些值。我想要类似的东西。类似UI.ReadPoint的东西。然后,每当代码到达这一行代码时,它应该强制用户在进入下一行之前单击屏幕。我在AutoCAD和Revit API中见过这种情况,希望在此处复制相同的行为。UI.ReadPoint必须提示用户单击并返回单击的点。@Vahid我更新了答案并添加了一种提示。谢谢Rufo爵士,但这仍然不是我所描述的。我怎样才能有一个像UI.ReadPoint这样的方法,我可以调用它并强制用户单击窗口。当前解决方案仅在引发按钮单击时有效。我是否遗漏了一些明显的东西?对不起,我不明白你的意思-我从你的问题中选取了你的样本,点击窗口的请求是通过点击一个按钮开始的,请查看你的代码。我无法回答你在问题中没有问到的问题。谢谢,我已经做到了这一点,但是我的问题
em是如何将其封装在我在评论中描述的方法中。例如,如果检查Console.ReadLine方法,当代码流到达该方法时,它会强制您在继续下一行代码之前输入一些值。我想要类似的东西。类似UI.ReadPoint的东西。然后,每当代码到达这一行代码时,它应该强制用户在进入下一行之前单击屏幕。我在AutoCAD和Revit API中见过这种情况,希望在此处复制相同的行为。UI.ReadPoint必须提示用户单击并返回单击的点。@Vahid我更新了答案并添加了一种提示。谢谢Rufo爵士,但这仍然不是我所描述的。我怎样才能有一个像UI.ReadPoint这样的方法,我可以调用它并强制用户单击窗口。当前解决方案仅在引发按钮单击时有效。我是否遗漏了一些明显的东西?对不起,我不明白你的意思-我从你的问题中选取了你的样本,点击窗口的请求是通过点击一个按钮开始的,请查看你的代码。我无法回答你在问题中没有提出的问题。