等待用户单击 C# WPF

Vah*_*hid 1 c# wpf events mouseevent

我想在 WPF 窗口中创建一个按钮,单击该按钮时,等待用户单击该窗口并获取单击的位置。一旦获取到位置,程序将继续执行下一行代码并显示点击的位置。

<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
    }
Run Code Online (Sandbox Code Playgroud)

Sir*_*ufo 5

这是TaskCompletionSource的解决方案

private TaskCompletionSource<Point> _clickSomeWhere;
private async void Button_Click( object sender, RoutedEventArgs e )
{
    ( sender as UIElement ).IsHitTestVisible = false;
    try
    {
        var point = await ReadPointAsync();
        MessageBox.Show( point.ToString() );
    }
    finally
    {
        ( sender as UIElement ).IsHitTestVisible = true;
    }
}

private async Task<Point> ReadPointAsync()
{
    _clickSomeWhere = new TaskCompletionSource<Point>();

    // here is your prompt
    this.Title = "Please click on the point you like!";

    try
    {
        return await _clickSomeWhere.Task;
    }
    finally
    {
        this.Title = "Thank you!";
    }
}

private void Window_MouseDown( object sender, System.Windows.Input.MouseButtonEventArgs e )
{
    if ( _clickSomeWhere != null )
    {
        _clickSomeWhere.TrySetResult( e.GetPosition( this ) );
        _clickSomeWhere = null;
    }
}
Run Code Online (Sandbox Code Playgroud)