问题
I want when the user clicks the Button
, the program to wait for the user to click on the Window
and would not proceed to the next line of code unless a Point
is acquired by clicking on the Window
. and then if it is acquired the next line will be processed and the Point
will be displayed.
<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 & 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
}
回答1:
Here a solution with 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;
}
}
回答2:
Will that work?
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;
}
You don't need to use "this", I just like to use it, not sure if it is a good practice.
来源:https://stackoverflow.com/questions/60132125/wait-till-user-click-c-sharp-wpf